web-dev-qa-db-ja.com

MediaSource APIのFFMPEGをMPEG-DASH(またはキーフレームクラスターを使用したWebM)にエンコード

現在、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ファイルに対してメディアソースAPIが機能しない(Chromeバージョン23.0.1271.97 m)

MediaSource APIおよびmp4

18
Chris Nolet

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程度です。それがビットかバイトかはわかりませんが、必要以上に大きく設定しているので、ヒットすることはないので問題ではありません。

4
Brad

現時点では、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

11
Cibrán Docampo

別のユーザーはいくつかの運がありました:

ffmpeg ... \
  -f mp4 \
  -reset_timestamps 1 \
  -movflags empty_moov+default_base_moof+frag_keyframe \
  -probesize 200000

次のgalbarmの質問を参照してください。

注:入力ビデオにキーフレームがない場合、以下を設定する必要があります。

-frag_duration 100000

... の代わりに +frag_keyframe

9
Chris Nolet

MediaRecorder APIによって記録された.webmファイルを再生しようとすると、Media Source Extensions(MSE)。 Chrome(51)記録の形式が正しくありません。Firefox(46)は問題ないようです。

動作させるには、.webmファイルのキューを修正する必要があります。

  1. クローン https://github.com/webmproject/libwebm
  2. cmakeバージョンが3.2以上であることを確認してください( https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. fixed.webmをDASH /自分のプレーヤーにロードしてください!

それが誰かを助けたことを願っています。 DASHキーワードなしで情報をGoogleで検索することは非常に困難でした(DASHは使用していません。同じ基盤技術であるMSEのみを使用しています)。

4
lukyer