私の現在の仕事では、FFMPEG の C ライブラリを使用して、いくつかの画像を h264 ビデオにエンコードしようとしています。結果のビデオは VLC で正常に再生されますが、プレビュー イメージはありません。ビデオは ubuntu の VLC および Mplayer で再生できますが、Mac または PC では再生されません (実際、Mac では「VTDecoderXPCService が予期せず終了します」というエラーが発生します)。
コマンドラインを使用してFFMPEGを介して結果のファイルを実行すると、結果のファイルにはプレビュー画像があり、どこでも正しく再生されます。
どうやら、プログラムから取得したファイルは奇妙な場所で破損していますが、コンパイルまたは実行中にどこを示す出力がありません。現時点では自分のコードを共有することはできません (作業コードはまだオープン ソースではありません :-( ) が、いくつかのことを試しました:
- ヘッダーとトレーラ データ (av_write_trailer) のみを書き込み、フレームは書き込みません
- トレーラを除いたフレームのみを書き込む (avcodec_encode_video2 と av_write_frame を使用)
- time_base と frame pts の値を調整して、毎秒 1 フレームのみをエンコードする
- すべての可変フレーム レート コードの削除
- ここでは気にしませんが、他の多くのバリアント
プロジェクトを作成する際に、次のチュートリアルにも従いました。
そして、公式ドキュメントに従ってubuntuでFFMPEGをコンパイルしました
そして、多数の StackOverflow の質問に相談しました。
- libavcodec を使用した mpegts コンテナー内の raw H264 フレーム
- MediaCodec を使用してビットマップをビデオにエンコードする方法は?
- ffmpegエンコーダ用にYUV420pからRGBを変換するには?
- FFmpeg C API を使用した H.264 ビデオのエンコード
- ffmpeg: h264 生データを mp4 ファイルとして保存する方法
しかし、プログラムを実行するたびに、まったく同じ問題が発生します。
私の質問は、FFMpeg のプログラムによる実行がコンソールでの実行と異なる原因となる明らかな何か(たとえば、不完全なファイナライズ、いくつかのスレッドの問題など) はありますか? コンソールを実行すると破損したファイルを修復できるという明白な理由のように? または、ビデオファイルを検査して破損箇所を見つけるための適切なツール/方法はありますか?