問題タブ [libavcodec]
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.
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で保存されます(すべてまったく同じエンコーディングを使用します)。
ここで何が間違っている可能性がありますか?
visual-c++ - libavcodecを使用したビデオフレームのエンコード
私はビデオコーディングの初心者であり、自分のプロジェクトのために簡単な作業を行う必要があります。
基本的に、私はメモリ内にポインタで簡単にアクセスできる一定数の生のRGBフレームを持っています。libavcodedを使用してそれらをエンコードしたいと思います。初期化は問題ありませんが、これらのフレーム情報をコーデックにフィードする方法を本当に理解できませんでした。avpicture_fill関数を使用する必要がありますか?できればいくつかの例を挙げて、私に光を当てていただけませんか。MSVC++環境を使用しています。
どうもありがとうございます。
ffmpeg - CODEC_FLAG2_BPYRAMIDのようなffmpegフラグはどこにありますか?
私はffmpegでVS2010を使用することを開発していて、ここからコードを試しました。しかし、VSはそれが見つけることができないと言います
CODEC_FLAG2_BPYRAMID+CODEC_FLAG2_MIXED_REFS+CODEC_FLAG2_WPRED+CODEC_FLAG2_8X8DCT+CODEC_FLAG2_FASTPSKIP; // flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip
X264_PART_I8X8+X264_PART_I4X4+X264_PART_P8X8+X264_PART_B8X8
avCodecContext.crf
彼らはどこにいますか?
c++ - ビデオを mp4 コンテナに保存するときの FPS が高すぎる
avi ファイルからフレームをデコードし、x264 でデコードして mp4 ファイルに保存すると、出力ファイルの fps は常に 12,800 になります。したがって、ファイルは非常に高速に再生されます。しかし、h264 でエンコードされたフレームを mp4 ではなく avi 形式で保存すると、fps は希望どおり - 25 になります。
何が問題なのですか?
VS2010で書いたコードは次のとおりです。
ffmpeg - オーディオ フレームは libavcodec によってどのようにデコードされますか?
これは、ffmpeg の libav* を使用してオーディオ ストリームをデコードするプロセスです。
[videofile]--> (オーディオ パケットの読み取り) --> [pkts キュー] --> (デコーダー) --> スピーカーのサンプル バッファー
何らかの理由で、デコーダーの後にバッファーを挿入する必要があります
[videofile]--> (オーディオ パケットの読み取り) --> [pkts キュー] --> (デコーダー) --> [サンプル バッファー] --> スピーカーのサンプル バッファー
のオーディオ サンプルsamples buffer
は LPCM 16 ビットです。オーディオのポイントを保存するにはsample buffer
、最初のサンプルのポイントを保存します。そうすれば、バッファ内の任意のサンプルのポイントを計算できます。
問題は、オーディオ ストリームに連続したオーディオ サンプルが含まれている場合にのみ計算が正しいことです。ffmpeg のデコードされたオーディオ フレームには常に連続したサンプルが含まれていますか?
c++ - OpenCV :: Matタイプのjpeg画像からavcodecを使用してビデオを作成するにはどうすればよいですか?
タイプのjpeg画像に色OpenCV::Mat
を付け、それらからを使用してビデオを作成しますavcodec
。取得したビデオは上下逆で、白黒で、各フレームの各行がシフトされ、対角線が表示されます。そのような出力の理由は何でしょうか?このリンクをたどって、avcodecを使用して取得したビデオをご覧ください。フレームからacpicture_fill
作成する関数を使用しています!avFrame
cv::Mat
PS各cv::MatcvFrameの幅=810、高さ= 610、ステップ= 2432 avFrame(acpicture_fillで埋められている)が2430ではなくlinesize[0]=2430
手動で設定しようとしたが、それでも役に立たなかった。avFrame->linesizep0]=2432
========コード========================================= ================
更新しました
@Alexが提案したように、1〜4行目を以下のコードに変更しました
私が今得ているビデオ(ここ)はほぼ完璧です。逆さまではなく、白黒ではありませんが、RGBコンポーネントの1つが欠落しているようです。すべての茶色/赤の色が青になりました(元の画像ではその逆である必要があります)。何が問題なのですか?フォーマットするためのrescaling(sws_scale
)はこれを引き起こしますか?AV_PIX_FMT_YUV420P
video - libavcodec はビデオの長さとフレームレートを取得します
でエンコードされたビデオが.3gp
h.264
あり、C でそのフレームレートとデュレーションを取得しようとしています。ファイルを開いて適切なコーデックを見つけた後に使用するコードは次のとおりです。
出力は次のとおりです。
ドキュメントから、期間が「duration/time_base」であることを意味していることを理解しています6594490 / 180000 = 36.6
。ビデオ ファイルの長さは です。6 seconds
この要素がどこから来るのかわかりません6
。
また、フレームレートは完全にオフになっているようです。
現在、多くのチュートリアルで非推奨の方法が使用されており、ドキュメントに例が記載されていないため、ヘルプを見つけるのは非常に困難です。
どんな助けでも大歓迎です。
ありがとう
編集: 以下のコメントのおかげで、私は以下を印刷することができました
私はまた、これでフレームのタイムスタンプを見つけることができましたmsec
:
これは、おおよそのものを返します33fps
(私は期待しています30
)。しかし、期間を取得する方法がわかりません。ドキュメントには「ストリームの継続時間、AV_TIME_BASE
小数秒」と記載されていますが6594490 * 0.000006 = 39.5
、正しい継続時間は6.3
秒です)。また、正確な fps はわかり30
ませんが、上記の数値0.000006
からどのように取得するかはわかりません)30
ありがとう
ffmpeg - ffmpeg のアップグレード後にデコーダがクラッシュする
最近、ffmpeg を 0.9 から 1.0 にアップグレードしました (Win7x64 および iOS でテスト済み) avcodec_decode_video2
。簡単に言うと、ビデオのサイズが変更されるたびにクラッシュが発生します (例: 320x240 から 160x120 に、またはその逆)。
独自のソースから mpeg4 ビデオ ストリームを受信し、次のようにデコードします。
繰り返しますが、上記のすべては、1.0 にアップグレードするまで問題なく機能していました。フレームの寸法が変わるたびに -avcodec_decode_video2
クラッシュします。AVCodecContext で幅/高さを割り当てていないことに注意してください-最初もストリームが変更されたときも-それが理由でしょうか?
アイデアをいただければ幸いです。
更新: ctx_.width と ctx_.height を設定しても役に立ちません。
Update2:クラッシュの直前に、次のログ メッセージが表示されます。
mpeg4、レベル 24: "未解放のバッファが 2 つ見つかりました!". レベル 8: 「アサーション i < avci->buffer_count が libavcodec/utils.c:603 で失敗しました」
Update3を 1.1.2 にアップグレードすると、このクラッシュが修正されました。デコーダは、オンザフライで次元の変更に再び対処できます。
php - avconvを使用して画像をビデオに変換する方法
次のコードを使用した画像からビデオを作成したい
しかし、出力ビデオを再生しようとすると、ストリームにデータが含まれていないと表示されます