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