Windowsのフォトで編集した動画をffmpegで結合する

2022年2月11日金曜日

ffmpeg Windows

t f B! P L
Windowsのゲームバーで画面録画した動画は、フォトのトリミング機能をつかうと不要な部分をカットすることができます。
ゲームバーで画面録画した動画とフォトでトリミングした動画は、ffmpegを使うと簡単に結合することができます。例えば、m1.mp4とm2.mp4を結合してoutput.mp4を作成する場合、次のコマンドを実行します。

$ffmpeg -f concat -i file.txt -c copy output.mp4
file.txtには、結合するファイル名を格納しておきます。

file m1.mp4
file m2.mp4
しかし、単純に結合すると、結合した動画が正常に再生できない場合があります。

結合した動画が正常に再生されない原因

ゲームバーで画面録画した動画と、それをフォトでトリミングした動画は、動画のfps とtimescaleが異なります。 ゲームバーで画面録画した動画をffprobeで確認すると、次のように表示されます。

$ffprobe m1.mp4
ffprobe version 4.3.1-2021-01-01-essentials_build-www.gyan.dev Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from m1.mp4:
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
    creation_time   : 2022-02-11T08:06:40.000000Z
    artist          : Microsoft Game DVR
    title           : m1
  Duration: 00:00:07.55, start: 0.000000, bitrate: 2523 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 640x748 [SAR 1:1 DAR 160:187], 1322 kb/s, 59.95 fps, 59.94 tbr, 60k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2022-02-11T08:06:40.000000Z
      handler_name    : VideoHandler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 79 kb/s (default)
    Metadata:
      creation_time   : 2022-02-11T08:06:40.000000Z
      handler_name    : SoundHandler
一方、フォトでトリミングした動画は次のように表示されます。

$ffprobe m2.mp4
ffprobe version 4.3.1-2021-01-01-essentials_build-www.gyan.dev Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from m2.mp4:
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
    creation_time   : 2022-02-11T08:06:40.000000Z
    artist          : Microsoft Game DVR
    title           : m2
  Duration: 00:00:06.72, start: 0.000000, bitrate: 232 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 640x748 [SAR 1:1 DAR 160:187], 110 kb/s, 30 fps, 30 tbr, 30k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2022-02-11T08:24:02.000000Z
      handler_name    : VideoHandler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 117 kb/s (default)
    Metadata:
      creation_time   : 2022-02-11T08:24:02.000000Z
      handler_name    : SoundHandler

正常に再生されない原因

元の動画はfps=59.95、トリミングした動画はfps=30で異なっています。このため、動画の結合時に、次のようなメッセージが大量に発生します。

 DTS 226559 < 451365 out of order
[mp4 @ 000002c4757584c0] Non-monotonous DTS in output stream 0:0; previous: 451365, current: 226559; changing to 451366. This may result in incorrect timestamps in the output file.

解決方法

トリミングした動画のfpsとtimescaleを元の動画に合わせてから動画の結合を行います。トリミングした動画をfps=59.95、timescaleを60kに設定するには次のコマンドを実行します。crfはお好みで設定します。

$ffmpeg -i m2.mp4 -crf 3 -r 59.95 -video_track_timescale 60k -codec:a copy  m2_mod.mp4
fpsを合わせた動画を結合すると正常に再生できる動画ができあがります。

$ffmpeg -f concat -i file.txt -c copy output.mp4
file.txt

file m1.mp4
file m2_mod.mp4
結合した動画を再エンコードすると、Bフレームを含む形で圧縮することができます。

$ffmpeg -i output.mp4 -crf 3 -codec:a copy output_final.mp4

このブログを検索

QooQ