web-dev-qa-db-ja.com

オーディオチャネルありとオーディオなしの複数のビデオのマージ

非常に異なるビデオを1つの出力ビデオにマージする必要があります。入力ビデオは、さまざまな解像度、フレームレート、チャネルなどを持つことができます。したがって、一部のビデオはオーディオチャネルなしである可能性があり、ビデオとマージする必要がありますオーディオチャネルあり。オーディオチャネルがあるかどうかは事前にわかりません。そのため、ffmpegと-filter_complexを使用してビデオを同じフレームサイズにし、次のフィルターconcatを使用してそれらをマージします。 (また、入力ビデオをカットする必要がありますが、ここではこの部分をスキップさせてください)

ffmpeg.exe -i "withAudio.flv" -i "noAudio.mpg" \
-filter_complex \
    "[0:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[v0]; \
    [1:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[v1]; \
    [v0][0:a] [v1][1:a] concat=n=2:v=1:a=1[v][a]" \
 -map "[v]" -map "[a]" -vcodec libx264 -b 512k -acodec libfaac -ar 44100 -ab 128k  \
-pix_fmt yuv420p -movflags faststart -y "result.mp4"

その結果、チャネルが見つからないというエラーが発生します

Stream specifier ':a' in filtergraph description [0:v]scale=1280:720, setsar=1/1
, setpts=PTS-STARTPTS[v0]; [1:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[
v1];  [v0][0:a] [v1][1:a] concat=n=2:v=1:a=1[v][a] matches no streams.

フル

ffmpeg version 2.8.6 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.9.3 (GCC)
  configuration: --prefix=/opt/xtendx/local --Arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --pkg-config=pkg-config --disable-pthreads --enable-w32threads --extra-libs=-lws2_32 --extra-libs=-lwinmm --extra-libs=-lgdi32 --enable-static --disable-shared --disable-debug --disable-indevs --disable-outdevs --disable-iconv --disable-bzlib --disable-ffplay --disable-ffserver --enable-gpl --enable-version3 --enable-nonfree --enable-librtmp --enable-libmp3lame --enable-libfaac --enable-libfdk-aac --enable-libx264 --enable-libvpx --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --enable-decoder=prores_lgpl --disable-decoder=prores --enable-runtime-cpudetect --disable-openssl
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, flv, from 'withAudio.flv':
  Metadata:
    starttime       : 0
    totalduration   : 30
    totaldatarate   : 484
    bytelength      : 1846185
    canseekontime   : true
    sourcedata      : B4A7D0D44HH1361885066111689
    purl            :
    pmsg            :
    httphostheader  : r15---sn-1gi7zn7s.c.youtube.com
  Duration: 00:00:30.48, start: 0.000000, bitrate: 484 kb/s
    Stream #0:0: Video: h264 (Main), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 388 kb
/s, 25 fps, 25 tbr, 1k tbn, 50 tbc
    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 99 kb/s
Input #1, mpeg, from 'noAudio.mpg':
  Duration: 00:00:29.96, start: 0.500000, bitrate: 8040 kb/s
    Stream #1:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 720x576 [SAR 64:4
5 DAR 16:9], 8000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc


Stream specifier ':a' in filtergraph description [0:v]scale=1280:720, setsar=1/1
, setpts=PTS-STARTPTS[v0]; [1:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[
v1];  [v0][0:a] [v1][1:a] concat=n=2:v=1:a=1[v][a] matches no streams.

ConcatフィルターのFFmpegドキュメントから:

The filter works on segments of synchronized video and audio streams.
All segments must have the same number of streams of eachtype, 
and that will also be the number of streams at output.

では、どうすれば複数のビデオをマージするコマンドを作成できますか異なるチャンネル番号で

2
Alex V

FFmpegは、オーディオストリームが2番目のビデオとペアになることを期待しています。ないので、ダミーを用意する必要があります。

入力に音声があるかどうかわからないため、入力ごとに次のコマンドを実行します。

ffmpeg -i <input> -f lavfi -i anullsrc -c:v copy \
-map 0:v -map 0:a? -map 1:a -shortest <output>

そして、処理されたファイルで

ffmpeg.exe -i <input1> -i <input2> \
-filter_complex \
"[0:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[v0]; \
 [1:v]scale=1280:720, setsar=1/1, setpts=PTS-STARTPTS[v1]; \
 [v0][0:a] [v1][1:a] concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -vcodec libx264 -b:v 512k -pix_fmt yuv420p \
-map "[a]" -acodec libfaac -b:a 128k -ar 44100 \
-movflags faststart -y "result.mp4"
3
Gyan