問題タブ [libavformat]
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 - コーデックがpフレームを使用する場合、av_seek_frameはavcodec_decode_video2を中断します
pフレーム(H.264など)でエンコードされたビデオを検索する方法を理解しようとしています。現在、すべてのフレームがキーフレーム(MJPEGなど)であるコーデックでエンコードされたビデオを検索する方法しかわかりません。
タイムスタンプが与えられると、最終的にはそのタイムスタンプのフレームを再生する必要があります。しかし今のところ、私はタイムスタンプの近くでキーフレームを再生しようとしています。だから、最初に-
次に、を含むいくつかの介在コードav_read_frame
。それで -
観察:
c++ - 英語以外のファイル名でavio_open関数を呼び出すことは無効です
libav を使用して Unicode ベースのプログラムを作成しており、libav を介して「中.mp4」というファイル名のファイルを作成したいと考えています。
このファイル名は英語ではありません。呼び出すと、関数は正の整数を返します(失敗しません)。
ただし、「中.mp4」の代わりに「ѱ۰.mp4」があります。(無効なファイル名です。)
どうしたの?
c++ - ffmpeg関数avformat_seek_file()の問題
ffmpegライブラリを使用してビデオ内の特定のフレームを検索しようとしています。機能があることは知っていましたが、代わりav_seek_frame()
に使うことをお勧めしましavformat_seek_file()
た。ここで言及されている同様の何か。
avformat_seek_file()
いつもあなたが望む正確なフレームにあなたを連れて行くことができるとは限らないことを私は知っています、しかしこれは私にとっては大丈夫です。最も近いキーフレームにジャンプしたいだけです。だから私はビデオを開き、ビデオストリームを見つけて次のように呼び出します:
常に0を返すので、正しい仕上がりだと理解しています。ただし、正常に機能しません。を呼び出す前後に、このようにバイト位置を確認しますavformat_seek_file()
。実際には変化しますが、異なるターゲットフレーム番号を入力しようとすると、常に同じように変化します。つまり、この呼び出し後のバイト位置は、frameNumber
値が異なっていても常に同じです。明らかに、私は何か間違ったことをしていますが、正確には何がわかりません。それが問題になるかどうかはわかりませんが、そのために.h264ファイルを使用しています。フレームの代わりにタイムスタンプを使用したり、前後のバッファをフラッシュしたりして、さまざまなフラグ、さまざまなファイルを試しましたが、うまくいきません。誰かがそれの何が悪いのか教えてくれたらとてもありがたいです。
c - Remux MPEG TS -> RTP MPEG ES
私のプログラム (C で書かれたもの) で次の結果を達成するために私を導いてください: HTTP MPEG TS ストリーム (コーデック h264 & aac) としてストリーム ソースがあり、1 つのビデオと 1 つのオーディオ サブストリームがあります。RTP 経由で RTSP クライアントに送信するには、(同じコーデックの) MPEG ES フレームを取得する必要があります。libavformat が RTP ヘッダー付きのフレームを提供するのが最善です。私が知っているように、Blackberry電話のメディアプレーヤーはTSを再生しないため、MPEG ESが必要です(私は試しました)。ただし、h264とaacを保持でき、ブラックベリーやその他の電話でうまく再生できる、この状況で入手しやすい別の形式を誰かが教えてくれたらありがたいです。
ストリームを開き、FLV コンテナーに再多重化する他のタスクは既に成功しています。
「rtp」形式で 2 つの出力形式コンテキストを開こうとしましたが、フレームも取得しました。クライアントに送信されます。失敗。
また、フレームを「m4v」AVFormatContextに書き込んで、フレームを取得し、NALでカットし、各フレームの前にRTPヘッダーを追加して、クライアントに送信しようとしました。クライアントが最初のフレームを表示してハングするか、10 秒以上ごとに 1 秒間のビデオとオーディオを (必要以上に速く) 再生します。VLC プレーヤーのログには次のようなものがあります: http://pastebin.com/NQ3htvFi
簡単にするために、タイムスタンプを 0 から開始するようにスケーリングしました。VLC (または覚えていない Wowza) がオーディオ TS を 1920 ではなく 1024 ずつインクリメントしたものと比較したので、他のストリーマーと同様になるように追加の線形スケーリングを行いました。bigbuckbunny_450.mp4 の再生のパケット ダンプはこちら: ftp://rtb.org.ua/tmp/output_my_bbb_450.log
ところで、どちらの場合も、Wowza または VLC から SDP をほとんどコピーしていません。
必要なものを取得する正しい方法は何ですか? libavformatに似たライブラリがあるかどうかも興味がありますか? 胚の状態でもかまいません。
ns2 - av_open_input_file は -2 を返しますが、ファイルは存在します (NS2 の libav)
NS2 で .wav ファイルを読み込み、gsm にエンコードしてネットワーク経由で送信するシミュレーションを作成しようとしています。私はすでに、.wav を読み取り、gsm にエンコードし、ハード ドライブに保存するアプリケーションを作成することができました (テスト済み、正常に動作します)。今、Network Simulator 2 を拡張して同じことをしようとしましたが、gsm エンコーディング アプリケーションでそのファイルに問題はありませんでしたが、常にそのようなファイルがないと言う av_open_input_file に問題があります。私が使用する呼び出し:
libavは明らかに何らかのファイルプロトコルを使用しているため、パス、絶対パス、相対パスをハードコーディングし、「file://」を前に置いて、すでに別のファイルを試しました。次に、自分でファイルを開こうとしました:
(この呼び出しは、av_open_input_file によって呼び出されることになっている libav の file.c で見つかりました) そのようなファイルを開くことに問題はありません。すべて問題ないようです。
助言がありますか?
よろしく、フロレンカ
ffmpeg - libav* 正しくないデコード
libav を使用して、ビデオからフレームを保存します。
問題は、decode 関数を数回呼び出すと、2 回目以降は正しく処理されないことです。
初めてそのような結論(すべて正常に動作します):
2番目(ストリームが見つかりませんが、これらは同じです):
エラーが発生した場所を教えてください。
main.cpp
ビデオ.cpp
ffmpeg -バージョン
c - ダイナミックリンクを介したFFmpeg(libavformat)のRTPデータ構造の使用
FFmpegのlibavformatによって提供されるRTPデータ構造(たとえば、libavformat / rtpenc.hのRTPMuxContext)を使用したいのですが、次のインストールでは使用できないようです。
/ usr / local / includeを見ると、libavformatディレクトリが表示されますが、そこにはavformat.h、avio.h、version.hのファイルしかありません。もちろん、libavformat / rtpenc.hをインクルードしようとすると、「エラー:libavformat / rtpenc.h:そのようなファイルまたはディレクトリはありません」というメッセージが表示されます。
FFmpegライブラリに動的リンクすることでこれを実現したいのですが(LGPL準拠などの理由で)、それは不可能のようです。
欠落しているconfigureスクリプトのパラメーター、または無視したインストール後の手順はありますか?
c - libavformat のエラー メッセージをオフにするにはどうすればよいですか
デフォルトでは、libavformat は次stderr
のようなエラー メッセージを に書き込みます。
Estimating duration from bitrate, this may be inaccurate
どうすればオフにできますか?またはさらに良いことに、それを自分のきちんとしたログ機能にパイプしますか?
編集: stderr を別の場所にリダイレクトすることは、他のログ記録の目的で必要になるため受け入れられません。libavformat に書き込みを行わないようにしたいだけです。
android - ファイル形式を flv から Android で再生できるものに変更します
エンコードされたこのファイルはh264ですが、flvコンテナにあり、mp4、3gp、またはandroid MediaPlayerが理解できるファイル形式に入れる必要があります。
これをネイティブでやりたい。何もデコードもエンコードもしないので、多くの電力を浪費することはないと思います (間違っていますか?)
ここhttp://www.roman10.net/?p=394の指示に従い、ffmpeg を正常にコンパイルして使用し、mp4 および 3gp ファイルで使用することができました。
しかし、flv ファイルに関しては失敗します。Android用のffmpegの特定のポートには、flvファイルのフォーマット定義がないことを理解しています。
たとえば、libavformat/flv.h ヘッダー ファイルはありません。
たぶんそれがこれが機能する理由です:
extern AVInputFormat ff_mov_demuxer;
av_register_input_format(&ff_mov_demuxer);
これは失敗しますが:
質問は、トンネルの終わりに光がありますか? 誰かが似たようなことをしましたか?それは役に立ちますか?つまり、いつでも flv メディア ファイルをフラッシュ プレーヤーに放り込むだけで、できあがりです。問題は、まだフラッシュを実行できない低速のデバイスを実行しているすべての人々には機能しないため、これは部分的な解決策になるということです。 .
ネルソン
PS。念のため。私が話しているファイルに関する情報は次のとおりです。
libavformat - libavformat のストリーム インデックスを変更する方法
私はffmpegの初心者です。一部のメディアに複数のオーディオ ストリームがある場合に問題が発生します。MKV ファイルに 3 つのオーディオ ストリーム (MP3、WMA、WMAPro) があるとします。
次を使用してデマルチプレクサするときにストリーム インデックスを変更するにはどうすればよいですか。
そのため、change_stream_index(int streamindex) のようなものを検索しています。その関数を呼び出すと (change_stream_index(2) とします)、次に av_read_frame を呼び出すと、MP3 ではなく WMAPro フレームが demux されます。
みんなありがとう!