現在、MediaSource APIを介して再生するために、ビデオストリームをChromeに送信しています。
私が理解しているように、MediaSourceは、MPEG-DASHでエンコードされたMP4ファイル、またはキーフレームで始まるクラスターを持つWebMファイルのみをサポートします(そうでない場合、エラーが発生します:メディアセグメントがキーフレームで始まりませんでした)。
リアルタイムでFFMPEGを使用してMPEG-DASHまたはキーフレームWebM形式でエンコードする方法はありますか?
編集:
私はffmpeg ... -f webm -vcodec vp8 -g 1
すべてのフレームがキーフレームになるように。理想的なソリューションではありません。ただし、現在はMediaStreamで動作します。すべてのフレームがキーフレームである必要がないように、セグメントをWebMのキーフレームと同期する方法はありますか?
WebM/MP4およびMediaSourceに関する参考質問:
WebMのすべてのクラスターがキーフレームで開始されるようにするには、次のようなものを試してください。
ffmpeg \
[...inputs] \
-vcodec libvpx \
-keyint_min 60 \
-g 60 \
-vb 4000k \
-f webm \
-cluster_size_limit 10M \
-cluster_time_limit 2100 \
[...output]
基本的に、実装時に、すべてのキーフレームはクラスターの先頭にある必要がありますが、逆は当てはまりません。つまり、キーフレームには新しいクラスターが存在しますが、新しいクラスターには必ずしもキーフレームが存在するとは限りません。この問題を回避するには、クラスターサイズを、決してヒットしないような大きな値に設定するだけです。
この例では、2秒ごとにキーフレームがあり、クラスターの時間制限は2.1秒なので、ヒットすることはありません。ビットレートは4Mビットで、クラスターサイズの制限は10M程度です。それがビットかバイトかはわかりませんが、必要以上に大きく設定しているので、ヒットすることはないので問題ではありません。
現時点では、FFMPEGはDASHエンコーディングをサポートしていません。 FFMPEG( https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment )でセグメント化できますが、FFMPEGとMP4Boxを組み合わせることをお勧めします。 FFMPEGを使用してライブビデオをトランスコードし、次にMP4Boxを使用して.mpdインデックスをセグメント化および作成します。
MP4BoxはGPACの一部です( http://gpac.wp.mines-telecom.fr/ )。
H264を使用した例を次に示します。
ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"
VP8(WebM)が必要な場合は、-vcodec libvpx
および-f webm
または-f ts
。
別のユーザーはいくつかの運がありました:
ffmpeg ... \
-f mp4 \
-reset_timestamps 1 \
-movflags empty_moov+default_base_moof+frag_keyframe \
-probesize 200000
次のgalbarmの質問を参照してください。
注:入力ビデオにキーフレームがない場合、以下を設定する必要があります。
-frag_duration 100000
... の代わりに +frag_keyframe
。
MediaRecorder APIによって記録された.webmファイルを再生しようとすると、Media Source Extensions(MSE)。 Chrome(51)記録の形式が正しくありません。Firefox(46)は問題ないようです。
動作させるには、.webmファイルのキューを修正する必要があります。
cmake .
make
./sample_muxer -i original.webm -o fixed.webm
それが誰かを助けたことを願っています。 DASHキーワードなしで情報をGoogleで検索することは非常に困難でした(DASHは使用していません。同じ基盤技術であるMSEのみを使用しています)。