web-dev-qa-db-ja.com

オーディオと画像を結合-> FFmpegを使用してビデオとして出力

1つの画像(jpg)と1つのオーディオファイル(MP3)があり、これをビデオファイル(たとえばAVI)として出力したいと思います。

FFMPEGを使用して2つを結合する方法を知っている人はいますか?音声の長さで画像を表示したいのですが。

誰かアイデアはありますか?

8
user41559

Windowsを使用している場合は、Windowsムービーメーカーでも実行できます...手順が必要な場合は、コメントを残してください

FFmpegの場合はこれを使用してください

ffmpeg -loop_input -vframes 14490 -i imagine.jpg -i audio.mp3 -y -r 30 
    -b 2500k -acodec ac3 -ab 384k -vcodec mpeg4 result.mp4
  • vframes 14490は、audio.mp3ファイル全体の連続画像を作成するためにループする必要のあるフレーム数です。

    例:8分3秒((8m x 60s + 3s)x 30fps = 14490 vf)

ここからのリソース

5
subanki

ここで提案されている方法よりもはるかに簡単な方法があり、フレーム数を計算したり、個々のファイルの長さを入力したりする必要はありません(特にバッチ処理に適しています)。最近のバージョンのffmpegでは、-shortestオプションを使用できます。これは、最短のストリームが終了するとエンコードを停止します。この場合、input.mp3(画像は永久にループするため、長さは無限です)。

ffmpeg -i input.mp3 -f image2 -loop 1 -r 2 -i input.jpg \
-shortest -c:a copy -c:v libx264 -crf 23 -preset veryfast output.mp4

これは、画像/ビデオに1秒あたり2フレームを使用します。これは問題ないはずですが、必要に応じて、より標準的な25に設定できます。

7
evilsoup

スバンキはほぼ正しかった。動作するコマンドラインは次のとおりです。

ffmpeg -y -loop 1 -i image.jpg -i audio.mp3 -r 30 -b:v 2500k -vframes 14490 -acodec libvo_aacenc -ab 160k result.mp4
-y

プロンプトを表示せずに出力ファイルを上書きする

-ループ1

オプション「-loop_input」は非推奨であり、-loop 1を使用します。 ffmpegドキュメント を参照してください。

-私

入力ファイル

-r

1秒あたりのフレーム数
次のように表すこともできます:-r 30000/1001、fpsが29.97nnn

-b:v

ビデオビットレート;数値が大きいほど、品質が高くなり、ファイルサイズが大きくなります。

-vframes

上で説明したように;オーディオファイルの合計時間を秒単位で取得します(例:00:02:41(2分41秒)は合計161秒(2 x 60)+ 41に相当します)。次に、合計秒数に、-rで指定した1秒あたりのフレーム数を掛けます(例:161 x 30 = 4830)。

-vframesは-t161に置き換えることができます(-tデュレーションレコードまたはオーディオ/ビデオのトランスコード「デュレーション」秒)

-コーデック

作成するファイルのタイプに適したオーディオコーデックを使用してください。 .mp4の場合は、AAC形式である必要があります。コーデックlibvo_aacencは、私のWindows7システムの正しいエンコーディングコーデックでした。

-ab

オーディオビットレート

result.mp4

これは、出力ファイルの名前です。システムの任意の正当なファイル名にすることができます。この拡張機能は、-vcodecを使用して指定しない場合、ffmpegが適切なビデオコーデックを決定するのに役立ちます。

5
Jon Hall

AUTOMAGICALLYがディレクトリ内の$ AUDIO拡張子のすべてのファイルをfolder.jpgイメージが埋め込まれたディレクトリ内の10FPSmp4ビデオファイルにエンコードする単純なbash/cygwinスクリプト。

youTubeのアップロードに便利です;)

AUDIO=m4a; 
$'\n'; for a in `ls -1 *.$AUDIO `; do ffmpeg -i $a &2> $a.info ; done;
cat '' > do.sh
IFS=$'\n'; 
for a in `ls -1 *.$AUDIO`; do D=`grep Duration $a.info | cut -d',' -f1 | cut -d' ' -f4 | cut -d'.' -f1 | head -n1 `; S=$(( $( echo $D | cut -d':' -f2 ) * 60 + 1 + ` echo $D | cut -d':' -f3  ` )) ; echo ffmpeg -loop_input -vframes $(( $S * 10 )) -i folder.jpg -i \"$a\" -y  -r 10 -b 2500k -ab 384k -vcodec mpeg4 \"$a.mp4\" >> do.sh;  done;
split -l5 do.sh
xa* &
1
user113368

ダウンロード VirtualDub 、次にこれを行います:

  1. 通常のビデオファイルを開くのと同じように画像を開きます。

  2. 音声の長さを秒単位で計算し、最も近い1秒に切り上げます(たとえば、78.34秒は79秒になります)。これ以降、この値をxと呼びます。

  3. 「ビデオ>フレームレート」に移動し、「フレームレート(fps)に変更」を選択し、値として「1/x」を入力します。さらに、25 fpsのような通常のフレームレートを結果のファイルに含めたい場合は、[fpsに変換]を選択し、そこに必要なフレームレートを入力します。

  4. 「ビデオ>圧縮」を選択し、お好みのフレーバーを選択してください。サイズ変更フィルターを使用して画像のサイズを調整する必要がある場合があります。

  5. 「オーディオ>他のファイルからのオーディオ」に移動し、そこでオーディオを選択します。必要に応じて、オーディオの圧縮を選択します。

  6. ファイルを保存します。

ソース: stephanV

0
Grumpy ol' Bear