FFMpeg でビデオをエンコードするとき、最初のビデオ フレームの前に jpg 画像を配置したいと思います。これは、「video」html5 タグを使用して Web ページにビデオを埋め込むと、最初の画像がスプラッシュ画像として表示されるためです。または、画像を 1 フレームのビデオにエンコードし、それをエンコードしたビデオに連結したいと考えています。「video」html5 要素の「poster」プロパティを使用したくありません。
2 に答える
concat フィルターを使用してそれを行うことができます。正確なコマンドは、スプラッシュ スクリーンの長さによって異なります。ビデオにもよりますが、約 1/25 から 1/30 秒の 1 フレームのスプラッシュ スクリーンは必要ないでしょう ;)
答え
まず、ビデオのフレーム レートを取得する必要があります。ffmpeg -i INPUT
値を見つけてみてくださいtbr
。例えば
$ ffmpeg -i a.mkv
ffmpeg version N-62860-g9173602 Copyright (c) 2000-2014 the FFmpeg developers
built on Apr 30 2014 21:42:15 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
[...]
Input #0, matroska,webm, from 'a.mkv':
Metadata:
ENCODER : Lavf55.37.101
Duration: 00:00:10.08, start: 0.080000, bitrate: 23 kb/s
Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
At least one output file must be specified
上記の例では、 を示しています25 tbr
。この番号を覚えておいてください。
次に、画像とビデオを連結する必要があります。このコマンドを試してください:
ffmpeg -loop 1 -framerate FPS -t SECONDS -i IMAGE \
-t SECONDS -f lavfi -i aevalsrc=0 \
-i INPUTVIDEO \
-filter_complex '[0:0] [1:0] [2:0] [2:1] concat=n=2:v=1:a=1' \
[OPTIONS] OUTPUT
動画に音声がない場合は、次の方法を試してください。
ffmpeg -loop 1 -framerate FPS -t SECONDS -i IMAGE \
-i INPUTVIDEO \
-filter_complex '[0:0] [1:0] concat=n=2:v=1:a=0' \
[OPTIONS] OUTPUT
FPS
=tbr
ステップ 1 で取得した値
SECONDS
= 画像を表示する期間。
IMAGE
= イメージ名
INPUTVIDEO
= 元のビデオ名
[OPTIONS]
= オプションのエンコーディング パラメータ (-vcodec libx264
または など-b:a 160k
)
OUTPUT
= 出力動画ファイル名
これはどのように作動しますか?
私が使用したコマンドラインを分割しましょう:
-loop 1 -framerate FPS -t SECONDS -i IMAGE
: これは基本的に次のことを意味します: 画像を開き、それをループして、 1 秒あたりのフレーム数で数SECONDS
秒のビデオを作成します。FPS
入力ビデオと同じ FPS にする必要があるのは、concat
後で使用するフィルターに制限があるためです。
-t SECONDS -f lavfi -i aevalsrc=0
: これは、SECONDS の間無音を生成することを意味します (0 は無音を意味します)。スプラッシュ画像の時間を埋めるには、沈黙が必要です。元の動画に音声がない場合、これは必要ありません。
-i INPUTVIDEO
: ビデオ自体を開きます。
-filter_complex '[0:0] [1:0] [2:0] [2:1] concat=n=2:v=1:a=1'
:ここが一番の醍醐味です。ファイル 0 ストリーム 0 (画像ビデオ)、ファイル 1 ストリーム 0 (無音オーディオ)、ファイル 2 ストリーム 0 および 1 (実際の入力オーディオおよびビデオ) を開き、concat
それらを一緒にエネートします。オプションn
、v
、およびa
は、2 つのセグメント、1 つの出力ビデオ、および 1 つの出力オーディオがあることを意味します。
[OPTIONS] OUTPUT
: これは、ビデオを出力ファイル名にエンコードすることを意味します。-c:v libx264 -crf 23 -c:a libfdk_aac (or -c:a libfaac) -b:a 128k
HTML5 ストリーミングを使用している場合、おそらくH.264 ビデオと AAC オーディオに使用したいと思うでしょう。
さらに詳しい情報
- 背後にある魔法の核となる
image2
デマルチプレクサのドキュメントを確認できます-loop 1
。 concat
フィルターのドキュメントも役立ちます。- もう 1 つの優れた情報源は、連結に関する FFmpeg wikiです。