問題タブ [avcodec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - AVコーデックの品質設定
avcodec lib AVCodecおよび AVCodecContext構造体の設定について何か説明はありますか?
ビット レートと gop は明らかですが、残りを ffmpeg と x264 プリセットにマッピングするのに問題があります。
たとえば、ffmpeg の高ビット レート設定は次のようにダンプされます
。 =2:cmp=2:subcmp=2:preme=2:qns=2
avcodec lib を同じ構成に設定するにはどうすればよいですか?
c++ - ffmpeg::avcodec_encode_video 設定 PTS h264
libavcodec を使用してビデオを H264 としてエンコードしようとしています
ffmpeg::avcodec_encode_video(codec,output,size,avframe);
avframe->pts 値が正しく設定されていないというエラーが返されます。
0,1、AV_NOPTS_VALUE、および 90khz * フレーム番号に設定しようとしましたが、それでもエラーが発生しますnon-strictly-monotonic PTS
ffmpeg.c の例では、ffmpeg::av_rescale_q() で packet.pts を設定していますが、これはフレームをエンコードした後にのみ呼び出されます。
MP4V コーデックで使用すると、avcodec_encode_video() 自体が pts 値を正しく設定します。
ffmpeg - デコーダーの完全なコピーを作成するにはどうすればよいですか?
mpeg4 ビデオ ストリームのカスタム実装用のビデオ デコーダー (FFMPEG/AVCodec を使用) を作成しています。このビデオ ストリームの特異性は、同じ親に基づいて多くの P フレームを作成する多くの「息子」ストリームに分割できることです。デコードしようとしているビデオ ストリームは、実際には一種の「ビデオ ツリー」です。このようなもの:
1 つのパスをたどることに決めたときに正常に動作する基本的なデコーダーを既に作成しました。問題は、ビデオ ツリー内の複数のパスをたどろうとした場合です。この時点で、デコーダーを「フォーク」して、2 つの異なるビデオ ストリームを追跡する必要があります。分割はキー フレームの後だけでなく、P フレームの後でも発生する可能性があるため、AVCodecContext を複製する必要があります (私は を使用しますavcodec_copy_context
) が、クリーン ステータスから新しいデコーダを作成するようです..以前のビデオ ステータスを無視しているようです、したがって、デコードされた P フレームは空のビデオ フレームに「適用」されます。おそらく使用してコンテキストをコピーするavcodec_copy_context
だけでは不十分です...何か提案はありますか? デコーダーのコンテキストと完全なステータスを複製するにはどうすればよいですか? または、参照を使用してストリームをデコードする他の方法はありますか? ありがとう!
encoding - avcodec/H264 でライブビデオをエンコードする場合
ライブ映像をavcodec/H264でエンコードしたい。いくつかの設定パラメータを試しました。
できます。デコード側は順調です。しかし、フレームサイズが大きすぎます。I フレームと P フレームは約 250,000 バイトで、B フレームは作成されません。どうしたの?
ありがとうございました。
build - FFmpeg LGPL ビルド
こんにちは、LGPL ライセンスの下で ffmpeg をビルドしようとしていますが、dll の作成に問題があります。
MinGW を使用して Windows プラットフォームでソースをビルドしており、以下の構成オプションを使用して最新のスナップショットをビルドしています。
ただし、これから作成してインストールすると、「avdevice-53.dll」のみが取得され、avcodecやavformatなどの他のものは取得されません。これらのファイルを作成できるようにするために他に何かする必要がありますか?
build - FFMPEGビルドエラー
私はffmpegのLGPLコピーを作成しようとしてきましたが、さまざまな構成方法を試しました。ffmpegサイトから最新のソースをダウンロードし、次の簡単な構成を使用しました
ただし、ビルドしようとするたびに、「avdevice-53.dll」と次のようなエラーメッセージが表示されるだけです。
私は何が間違っているのですか?
c++ - FFmpegはヘッダーサイズを取得します
問題は、ffmpegのフォーマットコンテキスト(AVFormatContext)からヘッダーサイズを取得することです。
今、私はそれを取得するために最初のパケット位置を使用しています:
フレームを読まずにそれを行うためのより良い方法はありますか?
ffmpeg - libavcodecはAVFrameをFIFOバッファにデコードします
私の目的は、ビデオファイルの複数のフレームをデコードし、デコードされたフレームをFIFOバッファーに蓄積して、後で読み取ることです。パケットをAVFRamemFrameにデコードします。
avcodec_decode_video2(mCodecContext、mFrame、&frameFinished、&mPacket);
通常、YUVフレームをmFrame-> data [n] [0]からFIFOバッファーにコピーすることができますが、memcpyを可能な限り削減しようとしています。したがって、mFrame-> data [n] [0]をコピーする代わりに、mFrame(それが指すフレームよりもはるかに小さい)をバッファーに格納したいだけです。読み取りに関しては、それをフェッチして、データ。
私はこれをやろうとしましたが、うまくいきませんでした。AVFrameはバッファからフェッチされますが、画面に表示すると、ビデオはフリーズしたように見えます。パケットをデコードするたびに同じmFrameを使用して上書きしていると思われるかもしれませんが、そうではありません。デコードループで毎回新しいAVFrame*を作成しています。
この問題は、avcodecの動作に関連していますか?何か案は?
ありがとうマイク
audio - 大きなオーディオファイルを.mpgにエンコードすると、av_write_frameが失敗します
ライブレンダリングされたビデオデータと既存の.wavファイルをmpgファイルにエンコードしています。
そのためには、最初にすべてのオーディオフレームを書き込み、次にレンダリングエンジンから入ってくるビデオフレームを書き込みます。小さい.wavファイル(<25秒)の場合、すべてが完全に正常に機能します。しかし、より長い.wavファイルを使用するとすぐに、av_write_frame(オーディオフレームを書き込む場合)は、約100フレームを書き込んだ後、-1を返します。失敗するフレームと同じになることはなく、最後のフレームになることもありません。すべてのテストファイルは、私がテストしたどのプレーヤーでも完全に再生できます。
私は多重化の例に従っています(多かれ少なかれ)。
オーディオフレームを書き込む私の関数は次のとおりです。
したがって、「オーディオフレームの書き込み中にエラーが発生しました。結果:-1」は、いくつかのフレームの後に常に表示されるものです。
そして、これが私のget_audio_frame関数です。
そして最後に、これは私がすべてのオーディオフレームを書き込むループです(.wavヘッダーについて心配する必要はありません、そのループの前にスキップしました):
ご覧のとおり、私はパケット内のほとんどすべてを出力しており、エラーの可能性をチェックしています。長いオーディオファイルをエンコードしているときにav_write_frameが失敗することを除けば、すべてが完全に正常に見えます。私が追跡しているすべてのパケット値は、すべてのフレームで100%同じです(明らかにデータポインタを除く)。また、前述のように、同じ手順は、より短いfp_sound_inputファイルに対しても問題なく機能します。avcodec_encode_audio2()およびavcodec_fill_audio_frame()も失敗することはありません。
エンコードに使用するコーデックは、CODEC_ID_MPEG2VIDEO(ビデオ)とCODEC_ID_MP2(オーディオ)です。.wavファイルはPCM16LEで保存されます(すべてまったく同じエンコーディングを使用します)。
ここで何が間違っている可能性がありますか?
video - ビデオ フレームの PTS と DTS について
avi から mp4(x264) にトランスコードするときに fps の問題が発生しました。最終的に問題は PTS と DTS の値にあったため、12 ~ 15 行目が av_interleaved_write_frame 関数の前に追加されました。
多くの投稿を読んだ後、私はまだ理解していません:
outStream->codec->time_base
= 1/25 およびoutStream->time_base
= 1/12800。最初のものは私が設定しましたが、なぜ、誰が 12800 を設定したのかわかりません。行 (7) の前outStream->time_base
= 1/90000 で、その直後に 1/12800 に変わることに気付きました。なぜですか? avi から avi にトランスコードすると、行 (2) が に変更されるavformat_alloc_output_context2(&outContainer, NULL, "avi", "c:\\test.avi";
ので、行 (7) の前後outStream->time_base
は常に 1/25 のままで、mp4 の場合とは異なります。なぜですか?outStream->codec
との time_base の違いは何outStream
ですか?- pts
av_rescale_q
を計算するには: 2 つの time_base を取り、それらの分数をクロスで乗算し、pts を計算します。なぜこのようにするのですか?私がデバッグしたように、encodedPacket.pts
値が 1 ずつ増加するので、値があるのになぜそれを変更するのでしょうか? - 最初の dts 値は -2 で、再スケーリングのたびにまだ負の数になっていますが、それでもビデオは正しく再生されました! ポジティブでいいのではないですか?