Mpegtsをffmpegにパイプすると、mp4に変換され、stdoutにパイプされます。ffmpegは、「muxerはシーク不可能な出力をサポートしていません」と言います。
たくさんの調査の後、mp4は、シークのためにそのようなオンザフライのトランスコーディングを行うには悪い選択であるという結論に達しました。つまり、本質的には、MP4をffmpegにパイプすることはできません。これは理にかなっています。
しかし、私は連続したmpegtsストリームを持っていません、私は5秒のチャンクを持っています。つまり、実際には次のようになります。
HTML5 MediaSourceにはこれらのmp4チャンクが必要です。断片化は問題ありません。チャームのように機能する、mp4box.jsを使用します。
質問:
本質的に:ファイルを使用せずに(どういうわけか)ffmpegと対話できますか?私の現在のソリューションは、ファイルと新しいチャンクのポーリングで機能しますが、これは醜いです。
私のffmpegコマンドに興味があれば、私に知らせてください。
断片化について言及したので、movflags
で有効にすることができます。各キーフレームで始まるフラグメントの例:
ffmpeg -i segment.ts -c copy -movflags frag_keyframe+empty_moov -f mp4 -
空のmoov
atomがあるということは、シークする必要がないため、パイプで機能することを意味します。
真の_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
を使用してファイルに直接出力する必要があります。しかし、誰かがこれを回避する方法を考え出したかどうか聞いてみたいです!