1

ユーザーがWebカメラからビデオを録画できるようにするアプリケーションがあります。ユーザーは3つのクリップを録画し、それらを1つのビデオに結合して再生します。

MP4に変換した後、3番目のクリップのオーディオとビデオが同期しないことがあるという問題があります。

プロセスが現在どのように機能するかを次に示します-

Mencoderを使用してAVIビデオファイルを結合し、その間にトランジションビデオを挿入してaviファイルを結合します。

mencoder.exe -oac copy -ovc copy -idx -o test.avi c:\temp\*.avi 

このエラーが発生します:

Muxer frame buffer cannot allocate memory!

1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!
1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!

ただし、ビデオはaviに結合され、このAVIはオーディオ同期の問題なしに再生されます。

mencoderを使用してインデックスを再作成

mencoder.exe -idx TEST.AVI 

この時点では、ビデオはAVIとして正常に再生されます。

ffmpegバッチファイルを使用してAVIをMP4に変換します。

set FFMPEG_DATADIR=c:\Presets
ffmpeg.exe -i "test.avi" -s 640x480 -y -strict experimental -acodec aac \
   -ab 128k -ac 2 -ar 48000 -vcodec libx264 -vpre medium -vpre ipod640 -r 24 \
   -g 48 -b 520000 -threads 64 "out.mp4"

これはすべて、Windowsのコマンドラインツールを使用してプログラムで(ビデオ編集GUIソフトウェアを使用せずに)実行する必要があります。

これがサンプルのaviファイルとmp4ファイルです。オーディオ/ビデオの同期は1:03マーク付近で行われます。AVIは同期が外れませんが、mp4は同期が外れます。

http://trtemp.s3.amazonaws.com/new.avi

http://trtemp.s3.amazonaws.com/new.mp4

誰かがこれを修正するための提案がありますか?

4

2 に答える 2

3

いくつかのこと:

  • ソースのコンポジットオーディオ同期が完全に完璧であるとは思いません。オリジナルの3つのソースクリップも見ると面白いでしょう。一般的なルールは、常に可能な限り最高品質のソースから始めることです。
  • ソースの3つのクリップにも48kHzの16ビットステレオオーディオがあると想定できますか?そこで変換が行われている場合は、おそらくこれが問題です。
  • FFmpegの内部aacCODECは実験的なものであるため、その-strict experimentalスイッチが必要です。音声同期の問題が発生しているため、これは明らかな問題の候補領域です。可能な場合は、 libfaacの使用を検討してください。(あなたは非常によくあなた自身のFFmpegコンパイルを構築しなければならないかもしれません。)
  • コアの数に関係なく、使用-threads 64しても高速化にはなりません。一般的に受け入れられている#コア* 3/2の規則に従います。したがって、4つのコアがある場合、マストは4 * 3 / 2 = 6です。私自身の実験では、-threads4〜6を超える各スレッドで収益率が低下し、12〜16のスレッドでゼロになります(まったくメリットはありません)。せいぜい、64スレッドは影響を与えません。最悪の場合、結果が遅くなったり、品質が低下したりします。
  • -copytsオプション を試してください。「入力から出力にタイムスタンプをコピーします。」
  • -asyncスイッチを試してみてください。

オーディオ同期方式。タイムスタンプに一致するようにオーディオストリームを「ストレッチ/スクイーズ」します。パラメータは、オーディオが変更される1秒あたりの最大サンプル数です。-async 1は、オーディオストリームの開始のみが修正され、後で修正されない特殊なケースです。

于 2011-03-07T10:47:11.010 に答える
0

Linuxでのmencoderを使用したaviまたはdv->mp4で同様のオーディオ同期の問題が発生しました。簡単な解決策は、最初にオーディオを抽出し、次にaviをmp4に変換し、最後のステップとして両方のトラックを一緒にマルチプレクサすることでした。次のようなシェルスクリプトavi2mp4.shを使用して実行できます。

#!/bin/bash
# convert avi files to mp4 with correct sync of video and audio.
# usage: avi2mp4 <sourcefile> <targetfile>
audiopart=$2.audiotmp.mp3
videopart=$2.videotmp.mp4
mencoder -of rawaudio -oac lavc -lavcopts acodec=mp2:abitrate=128 -ovc copy -o $audiopart $1 
mencoder  -oac mp3lame -ovc x264 -vf yadif=0:harddup -o $videopart  $1 
mencoder -oac copy -ovc copy -audiofile $audiofile -o $2 $videopart
rm $audiopart
rm $videopart

于 2021-02-02T20:29:41.303 に答える