問題タブ [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.
ffmpeg - FFmpeg でのバイト単位のシーク
以下について、アドバイスをいただければ幸いです。FFmpeg の libavformat に基づくビデオ コンバーターを開発しています。正確なシーク API を実装する必要があります。まず、すべてのパケットのプレゼンテーション タイムスタンプ (PTS) を保存するビデオ ストリームのインデクサーを開発しました。次に、エンコーダーはこのインデックスを使用してビデオ ファイルをシークします。この操作の前に、たとえば、ファイルを mp4 コンテナーに再多重化します。内部に正しいインデックスがないビデオ、またはビデオにインデックスがまったくないビデオには、Remux が必要です。もちろん、以前に作成されたインデックスを使用して、バイトごとのシークを実装する必要があります。これを実装するために多くの方法を試しましたが、成功しませんでした。FFmpeg で正確なバイト単位のシークを実装する方法をご存知でしょうか? よろしくお願いします。
libavcodec - av_register_all()とavcodec_register()
av_register_all()を呼び出す代わりに、使用する単一のデコーダーを選択する例はありますか?私はavcodec_register()、av_register_codec_parser()などを呼び出さなければならないと思います...
問題は、av_register_all()を使用しない場合、av_open_input_file()が-2で失敗するため、どの関数を正確に呼び出す必要があるかということです。
android - ffmpeg - 使用する必須フィルター
Android用のffmpegをコンパイルしています。構成でどのフィルターが必須なのか疑問に思っています。誰かが知っているなら、私に提案してください。
android - ffmpeg-avcodec_decode_audio3はAndroidでaacデコードで常に0を返します
私はAndroid用のffmpegに基づいたオーディオデコーダーを書いています。そこではaacオーディオをデコードする必要がありますが、何らかの理由で常にデコードされた0バイトを返します。
私はすべてを正しく通過するように見えます。私の場合、何がうまくいかなかったのか誰か教えてもらえますか?ffplay.cからコードをコピーしました。avcodec_decode_audio3関数が常にゼロを返す理由は何ですか?
これがffplay.cからのコードです:
c# - C#のFFmpegとDirectSound / XAudio2
私はこれをしばらくの間機能させようと試みてきましたが、少し行き詰まっています。
DirectXおよびDirectSoundまたはXAudio2へのlibavcodec出力を使用して、C#でビデオを再生できるようにしようとしています。私はそれをビデオで再生することができましたが、サウンドを出力するためにそれを取得することに固執しています。
DirectSoundまたはXAudio2のいずれかを使用した経験がないこと、またはlibavcodecにドキュメントがほとんどないことは役に立ちません。オーディオコーデックを取得できましたが、DirectSound/XAudio2を介してデコードまたは出力しようとしてスタックしています。
誰かが私を正しい方向に向けることができるか、それを行う方法を教えてくれるなら、私は感謝するでしょう。
c - libavcodec を使用した mpegts コンテナー内の raw H264 フレーム
次の問題について助けていただければ幸いです。
H264 圧縮ビデオ フレームを生成するカメラ付きのガジェットがあり、これらのフレームはアプリケーションに送信されています。これらのフレームはコンテナーではなく、生データのみです。
ffmpeg 関数と libav 関数を使用して、後で使用できるビデオ ファイルを作成したいと考えています。
フレームをデコードしてからエンコードすると、すべて正常に動作し、有効なビデオ ファイルが得られます。(デコード/エンコードの手順は通常のlibavコマンドです。ここでは特別なことは何もありません。万能のインターネットから取得しました。それらは堅実です)...ただし、デコードとエンコードで多くの時間を無駄にしているので、この手順をスキップして、フレームを出力ストリームに直接配置します。さて、問題が発生します。
エンコーディングを生成するために思いついたコードは次のとおりです。
変数は次のようになります。
frameData
カメラから送信されたデコード済みフレーム データで、前のステップでデコードされvideoOutBuf
、データを保持するためのプレーンな uint8_t バッファーです。
フレームをデコードせずに、次のようなデータを単純に通過させるようにアプリケーションを変更しました。
どこ
frameData
は生の H264 フレームで、生の H264 フレームcurrentFrameSize
のサイズです。フレームごとにガジェットから取得するバイト数。
そして突然、アプリケーションが正しく動作しなくなり、生成されたビデオが再生できなくなります。パケットに正しい PTS を設定していなかったので、これは明らかです。私がしたことは次のとおりです(私は必死です、このアプローチからそれを見ることができます:))
ここtimestamps
で実際には、上記の作業コードによって生成され、ファイルに書き込まれた PTS のリストです (はい、正しく読んでください。10 分間のセッションですべての PTS をログに記録し、それらを使用したかったのです)。
アプリケーションはまだ機能しません。
さて、ここで私は何をすべきか見当もつかないので、ここに質問があります:
libav 関数を使用して「mpegts」ビデオ ストリームを作成し、既にエンコードされたビデオ フレームをストリームに挿入し、それを使用してビデオ ファイルを作成したいと考えています。どうすればいいのですか?
ありがとう。
ffmpeg - コーデックがpフレームを使用する場合、av_seek_frameはavcodec_decode_video2を中断します
pフレーム(H.264など)でエンコードされたビデオを検索する方法を理解しようとしています。現在、すべてのフレームがキーフレーム(MJPEGなど)であるコーデックでエンコードされたビデオを検索する方法しかわかりません。
タイムスタンプが与えられると、最終的にはそのタイムスタンプのフレームを再生する必要があります。しかし今のところ、私はタイムスタンプの近くでキーフレームを再生しようとしています。だから、最初に-
次に、を含むいくつかの介在コードav_read_frame
。それで -
観察:
ffmpeg - ffmpegでフレーム間コーデックを検出する方法は?
ffmpegで、コーデック(AVCodec
またはAVCodecContext
)がフレーム間エンコーディングをサポートしているかどうかを確認する方法はありますか?
ffmpeg - libavcodec 使用時に FFMPEG '-sameq' フラグをエミュレートするために必要な設定
現在、libavcodec を使用して、MP4 (MPEG4 および H264) および MPG (MPEG2) ビデオ ファイルを .MP4、.MPG、および .AVI ファイルにトランスコードしようとしています。入力ファイルと同じ/類似した品質の出力ファイルを保持するために、「-sameq」フラグを使用してFFMpeg.exeを使用してこれを以前に行っていました。
av_open_input_file、av_read_frame、avcodec_decode_video2 を使用して入力ファイルを開き、読み取り、デコードしてから、AVCodecContext を割り当て、avcodec_encode_video を使用してデータをエンコードします。ただし、出力ファイルのビデオ品質はかなり悪いです。
これらは私が使用している AVCodecContext 設定ですか?:-
「-sameq」設定をエミュレートするために必要な追加設定、または出力品質を向上させるために AVCodecContext で必要な追加設定を知っている人はいますか?
c - libavcodec/ffmpeg にフレームをドロップするように指示する
動画を作成するアプリを作成しています。問題は、フレーム取得プロセスが十分に速くない場合があることです (ほとんどの場合)。
私が現在行っているのは、遅れた場合に現在のフレームの取得をスキップすることですが、FFMPEG/libavcodec は、渡すすべてのフレームを次のフレームと見なすため、2 フレームのうち 1 つをドロップすると、20 秒のビデオ10 しか持続しません。サウンド処理がはるかに高速であるため、サウンドを追加するとすぐに問題が発生します...
FFMPEG に伝えたいのは、「最後のフレームは当初の意図よりも 2 倍長く続く必要がある」、またはリアルタイムで処理できるものなら何でもいいということです。
ある時点でフレームをスタックしようとしましたが、これによりすべてのメモリが失われます(ハードドライブにフレームを「スタック」しようとしましたが、予想どおり遅くなりました)
手動でptsを操作する必要があると思いますが、私の試みはすべて失敗し、VLCなどのffmpegを使用する他のアプリコードを読むことはあまり役に立ちませんでした...だから、どんなアドバイスも大いに役立ちます感謝!
よろしくお願いします!