web-dev-qa-db-ja.com

FFMPEG:mp4へのTransmux mpegtsはエラーを出します:muxerはシークできない出力をサポートしていません

Mpegtsをffmpegにパイプすると、mp4に変換され、stdoutにパイプされます。ffmpegは、「muxerはシーク不可能な出力をサポートしていません」と言います。

たくさんの調査の後、mp4は、シークのためにそのようなオンザフライのトランスコーディングを行うには悪い選択であるという結論に達しました。つまり、本質的には、MP4をffmpegにパイプすることはできません。これは理にかなっています。

しかし、私は連続したmpegtsストリームを持っていません、私は5秒のチャンクを持っています。つまり、実際には次のようになります。

  • これが私の1mb * .tsファイルです
  • EOFに達するまでパイプから読んでください
  • それをmp4に変換してください(本当にシークする必要がある場合は、バッファをよく使用してください)
  • 完全な内部mp4バッファをstdoutにパイプしてください

HTML5 MediaSourceにはこれらのmp4チャンクが必要です。断片化は問題ありません。チャームのように機能する、mp4box.jsを使用します。

質問:

  • FFMPEGはこの種の内部バッファリングを行うことができますか?
  • 考慮すべきより良いオプションはありますか?

本質的に:ファイルを使用せずに(どういうわけか)ffmpegと対話できますか?私の現在のソリューションは、ファイルと新しいチャンクのポーリングで機能しますが、これは醜いです。

私のffmpegコマンドに興味があれば、私に知らせてください。

15
Kr0e

断片化について言及したので、movflagsで有効にすることができます。各キーフレームで始まるフラグメントの例:

ffmpeg -i segment.ts -c copy -movflags frag_keyframe+empty_moov -f mp4 -

空のmoov atomがあるということは、シークする必要がないため、パイプで機能することを意味します。

18
aergistal

真の_mp4_形式がなくても生活できる場合は、ismvを手動で調整するよりも、movflagsを使用する方が実際にうまく機能しました(特定のプレーヤーのシークと合計期間の情報にダメージを与えませんでした)。 ffmpeg形式のドキュメント によると、ismv形式は_mp4_に似ていますが、ストリーミング用にmovflagsを自動調整し、私の意見ではそれをより適切に処理します。

テスト済み:Firefox、Chrome、VLC

_ffmpeg -i input.mp4 -f ismv -
_

残念ながら、このコマンドも aergistalの回答 Twitterのビデオアップロード検証は非常に厳格であり、私が想像するものを要求することが最も一般的であるため、19/12/20の時点でTwitterへのアップロードと互換性のあるビデオを作成しません_mp4_フォーマット。そのため、現時点では、Twitterビデオのアップロードを可能にするためにffmpegではなく、stdoutを使用してファイルに直接出力する必要があります。しかし、誰かがこれを回避する方法を考え出したかどうか聞いてみたいです!

0
Sharpiro