14

1つのビデオに結合したい2つのビデオがあり、両方のビデオが静的な背景画像の上に配置されます。(このようなことを考えてください。)私の要件は、使用するソフトウェアが無料であり、OSXで実行され、ビデオを何度も再エンコードする必要がないことです。また、この操作は多くのことを行うので、コマンドラインまたはスクリプトを介して実行できるようにしたいと思います。(ただし、これは厳密には必要ありません。)

ffmpegを数時間いじってみましたが、後処理にはあまり適していません。オーバーレイ機能を使って何かを一緒にハックする可能性はありますが、これまでのところ、画像をビデオに変換するのに苦労することを除けば、その方法がわかりません(ビデオの長さの2倍の時間がかかります!)次に、別のレンダリング手順で2つのビデオを重ね合わせます。

任意のヒント?ありがとうございました!


アップデート:

LordNeckbeardの助けのおかげで、1回のffmpeg呼び出しで目的の結果を達成することができました!残念ながら、エンコードは非常に遅く、1秒のビデオをエンコードするのに6秒かかります。これは背景画像が原因だと思います。エンコーディングを高速化するためのヒントはありますか?ffmpegログは次のとおりです。

MacBook-Pro:Video archagon$ ffmpeg -loop 1 -i underlay.png -i test-slide-video-short.flv -i test-speaker-video-short.flv -filter_complex "[1:0]scale=400:-1[a];[2:0]scale=320:-1[b];[0:0][a]overlay=0:0[c];[c][b]overlay=0:0" -shortest -t 5 -an output.mp4
ffmpeg version 1.0 Copyright (c) 2000-2012 the FFmpeg developers
  built on Nov 14 2012 16:18:58 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
  configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
  libavutil      51. 73.101 / 51. 73.101
  libavcodec     54. 59.100 / 54. 59.100
  libavformat    54. 29.104 / 54. 29.104
  libavdevice    54.  2.101 / 54.  2.101
  libavfilter     3. 17.100 /  3. 17.100
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, image2, from 'underlay.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1024x768, 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flv, from 'test-slide-video-short.flv':
  Metadata:
    author          : 
    copyright       : 
    description     : 
    keywords        : 
    rating          : 
    title           : 
    presetname      : Custom
    videodevice     : VGA2USB Pro V3U30343
    videokeyframe_frequency: 5
    canSeekToEnd    : false
    createdby       : FMS 3.5
    creationdate    : Mon Aug 16 16:35:34 2010
    encoder         : Lavf54.29.104
  Duration: 00:50:32.75, start: 0.000000, bitrate: 90 kb/s
    Stream #1:0: Video: vp6f, yuv420p, 640x480, 153 kb/s, 8 tbr, 1k tbn, 1k tbc
Input #2, flv, from 'test-speaker-video-short.flv':
  Metadata:
    author          : 
    copyright       : 
    description     : 
    keywords        : 
    rating          : 
    title           : 
    presetname      : Custom
    videodevice     : Microsoft DV Camera and VCR
    videokeyframe_frequency: 5
    audiodevice     : Microsoft DV Camera and VCR
    audiochannels   : 1
    audioinputvolume: 75
    canSeekToEnd    : false
    createdby       : FMS 3.5
    creationdate    : Mon Aug 16 16:35:34 2010
    encoder         : Lavf54.29.104
  Duration: 00:50:38.05, start: 0.000000, bitrate: 238 kb/s
    Stream #2:0: Video: vp6f, yuv420p, 320x240, 204 kb/s, 25 tbr, 1k tbn, 1k tbc
    Stream #2:1: Audio: mp3, 22050 Hz, mono, s16, 32 kb/s
File 'output.mp4' already exists. Overwrite ? [y/N] y
using cpu capabilities: none!
[libx264 @ 0x7fa84c02f200] profile High, level 3.1
[libx264 @ 0x7fa84c02f200] 264 - core 119 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf54.29.104
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1024x768, q=-1--1, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 (png) -> overlay:main
  Stream #1:0 (vp6f) -> scale
  Stream #2:0 (vp6f) -> scale
  overlay -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help

アップデート2:

できます!重要な調整の1つは、underlay.png入力を入力リストの最後に移動することでした。これにより、パフォーマンスが大幅に向上しました。これが私の最後のffmpeg呼び出しです。(この特定の配置では、最後のマップは必要ありませんが、出力にマップしたい追加のオーディオ入力がいくつかある場合があります。)

ffmpeg
    -i VideoOne.flv
    -i VideoTwo.flv
    -loop 1 -i Underlay.png
    -filter_complex "[2:0] [0:0] overlay=20:main_h/2-overlay_h/2 [overlay];[overlay] [1:0] overlay=main_w-overlay_w-20:main_h/2-overlay_h/2 [output]"
    -map [output]:v
    -map 0:a
    OutputVideo.m4v
4

1 に答える 1

55

ffmpegの複雑なフィルターグラフは、最初は複雑に見えるかもしれませんが、数回試してみると理にかなっています。フィルタグラフの構文に精通している必要があります。フィルタリングの概要フィルターグラフの説明を読むことから始めます。完全に理解する必要はありませんが、次の例を理解するのに役立ちます。

静止画像上の2つのビデオ

ビデオフィルターを使用しscaleて入力を特定のサイズにスケーリング(サイズ変更)してから、overlayビデオフィルターを使用して静止画像の上にビデオを配置します。

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
 [2:v]scale=(iw/2)-20:-1[b]; \
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" output.mkv

これはどういう意味ですか

非フィルタリングオプション:

  • -loop 1次の入力であるを継続的にループしますbackground.png

  • background.png背景画像。ストリーム指定子[0:v]1280x720のサイズです。

  • video1.mp4この最初のビデオ入力(例の画像のBig Buck Bunny)。ストリーム指定子は[1:v]です。サイズは640x360です。

  • video2.mp4この2番目のビデオ入力(サンプル画像のバーミント)。ストリーム指定子は[2:v]です。サイズは640x360です。

フィルタリングオプション

  • -filter_complex複雑なフィルターグラフを開始するオプション。

  • [1:v]scale=(iw/2)-20:-1[a]これはvideo1.mp4、と呼ばれる、を取得し、[1:v]スケーリングします。iw入力幅のエイリアスであり、この場合は640の値です。半分よりも分割し、パディングとしてさらに20ピクセルを減算して、オーバーレイされたときに各ビデオの周囲にスペースができるようにします。-1アスペクトを保持する値を自動的に計算することを意味します。もちろん、空想を省略して、。などの値を手動で指定することもできますscale=320:240。次に、この出力を後で参照できるように、という名前の出力リンクラベルを使用します。[a]

  • [2:v]scale=(iw/2)-20:-1[b]上記と同じですがvideo2.mp4、入力として使用し、出力リンクラベルに。という名前を付けます[b]

  • [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]最初のオーバーレイ入力として使用し、2番目のオーバーレイ入力background.pngとしてと呼ばれる最初のスケールフィルターの結果を使用し[a]ます。[a]上に置き[0:v]ます。背景入力()の高さを参照するメインの高さmain_hのエイリアスです。はオーバーレイの高さのエイリアスであり、前景の高さ()を指します。この例では、BigBuckBunnyを左側に配置します。最短の入力が終了すると、出力が強制的に終了します。それ以外の場合は、ループしているため、永久ループになります。このフィルターの結果に名前を付けます。[0:v]overlay_h[a]shortest=1background.png[c]

  • [c][b]overlay=overlay_w*2:overlay_h:shortest=1[video][c]最初のオーバーレイ入力および2番目のオーバーレイ入力として使用し[b]ます。オーバーレイパラメータoverlay_woverlay_h(オーバーレイ入力の幅と高さ)を使用します。この例では、バーミニーバーミントを右側に配置します。出力に。というラベルを付けます[video]

  • -map "[video]"フィルタからの出力を出力ファイルにマップします。フィルタグラフの[video]最後にあるリンクラベルは必ずしも必要ではありませんが、マッピングで明示的にすることをお勧めします。

オーディオ

2つの別々のオーディオストリームがあります

デフォルトでは、最初に検出された入力オーディオチャネルのみが、ストリーム選択で定義されているように出力で使用されます。このオプションを使用して-map、2番目のビデオ入力からオーディオトラックを追加できます(出力には2つのオーディオストリームが含まれます)。この例では、再エンコードする代わりにオーディオをストリームコピーします。

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
 [2:v]scale=(iw/2)-20:-1[b]; \
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
-map "[video]" -map 1:a -map 2:a -codec:a copy output.mkv

両方のオーディオストリームを組み合わせる

または、amergepanオーディオフィルターを使用して両方のオーディオ入力を1つに結合します(両方の入力がステレオであり、ステレオ出力が必要であると想定しています)。

ffmpeg -loop 1 -i background.png -i video1.mp4 -i video2.mp4 -filter_complex \
"[1:v]scale=(iw/2)-20:-1[a]; \
 [2:v]scale=(iw/2)-20:-1[b]; \
 [0:v][a]overlay=10:(main_h/2)-(overlay_h/2):shortest=1[c]; \
 [c][b]overlay=main_w-overlay_w-10:(main_h/2)-(overlay_h/2)[video]" \
 [1:a][2:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[audio]" \
-map "[video]" -map "[audio]" output.mkv

も参照してください

于 2012-11-15T20:01:34.880 に答える