問題タブ [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 - WMV ファイルの場合、avformat_find_stream_info() で「Extra data: 8 bits left, value: 0」というメッセージが表示される
wmv ファイルに対して avformat_find_stream_info() を呼び出すと、次のメッセージが常に表示されます:
[wmv3 00FAEAE0] Extra data: 8 bits left, value: 0
その後、プログラムは期待どおりに動作しますが、とにかくそのメッセージの意味を知りたいですか? ありがとうございました!
ファイル情報 (ffmpeg -i による):
コード:
ffmpeg - ffmpeg と c++ を使用して自作のストリームを rtmp サーバーに公開する方法は?
皆さん、良い一日を!
画面をキャプチャし、ストリームを rtmp (ブロードキャスト用) で Wowza サーバーに送信する Windows 用のアプリケーションを作成しています。私のアプリケーションはffmpegとQtを使用しています。WinApi で画面をキャプチャし、バッファーを YUV444 に変換し (最も単純なため)、decoding_encoding.c ファイルで説明されているようにフレームをエンコードします (FFmpeg の例から)。
このコードによって生成されたビデオ ストリームを RTMP サーバーに送信する必要があります。つまり、このコマンドには c++/c アナログが必要です。
便利ですが、ストリームをファイルに保存したくありません。ffmpeg ライブラリを使用して、画面キャプチャをリアルタイムでエンコードし、エンコードされたフレームを自分のアプリケーション内の RTMP サーバーに送信したいと考えています。AVFormatContext を適切に初期化し、エンコードされたビデオ AVPackets をサーバーに送信する方法の例を少し教えてください。
ありがとう。
c++ - vcopy/acopyでlibavformatを使用してH.264AnnexBおよびAACストリームを多重化する
IPカメラからのビデオ(H.264)とオーディオ(AAC)との統合作業を行っています。
私は少し進歩しました、そして私はVLCプレーヤーを使ってそれを再生する能力でビデオとオーディオストリームを個別に保存することができます。H.264はAnnexB形式で保存されており、オーディオはadts形式のファイルを使用しています。
私は今、デコードやエンコードを行わずにストリームをMP4ファイルに多重化しようとしていますが、これまでのところ答えを見つけることができていません。
私はffmpegでこれを手動で行うことができます:ffmpeg -i recording.h264 -i recording.aac -vcodec copy -acodec copy -absf aac_adtstoasc recording.mp4
C ++のffmpegライブラリでこれを行うにはどうすればよいですか?
video - 動画ファイルの I/P/B フレーム数を取得するには?
ビデオ ファイルの情報を抽出して、その I/P/B フレームの数を取得したいと考えています。ffmpegでそれを行う方法は?または、libavformat と libavcodec を使用してプログラミングする必要がありますか? どうもありがとう!
ffmpeg - ffmpegのストリームからHTTPヘッダーを取得するには?
現在、Android でオーディオ ストリーミング アプリを作成しています。私は Android NDK を ffmpeg と組み合わせて使用しており、これまでのところかなりうまく機能しています。
現在、ストリーミング中にヘッダー ストリームに含まれるshoutcast メタデータを取得したいと考えています。どうやらffmpegはそれを行う直接的な方法を提供していませんが、ストリーミング中にすべてのバイトを受信しているため、ストリームからHTTPヘッダーを取得することは技術的に可能であると確信しています.
ffmpeg を使用してストリームから HTTP ヘッダーを取得する方法を知っている人はいますか?
c++ - libavformat を使用して MP4 に多重化された H.264 が再生されない
H.264 データを MP4 ファイルに多重化しようとしています。この H.264 Annex B データを MP4 ファイルに保存する際にエラーはないように見えますが、ファイルの再生に失敗します。
ファイルのバイナリ比較を行ったところ、MP4 ファイルのフッター (トレーラー) に書き込まれている内容のどこかに問題があるようです。
ストリームの作成方法などに問題があると思います。
初期化:
私が持っているこのプロトタイプ アプリの一部は、IFrame ごとに png ファイルを作成することです。したがって、最初の IFrame に遭遇すると、ビデオ ストリームを作成し、av ヘッダーなどを書き込みます。
私はパケットを書き出します:
最後にファイルを閉じます:
H.264 データを単独で取得して変換すると、次のようになります。
ファイルの「フッター」以外はすべて同じです。
私のプログラムからの出力: readrec recording.tcp out.mp4 **** START **** 01-03-2013 14:26:01 180000 Output #0, mp4, to 'out.mp4': Stream #0:0 : ビデオ: h264, yuv420p, 352x288, q=2-31, 512 kb/s, 90k tbn, 25 tbc **** END **** 01-03-2013 14:27:01 102000 1499 ビデオ フレームを書き込みました。
CODE を使用して作成された MP4 ファイルを ffmpeg を使用して変換しようとすると、次のようになります。
ストリームの設定方法に関係している必要があることを除いて、問題がどこにあるのか本当にわかりません。私は、他の人が同様のことをしているコードの一部を見て、このアドバイスをストリームの設定に使用しようとしましたが、役に立ちませんでした!
H.264/AAC 多重化 (同期) ファイルを作成した最終的なコードは次のとおりです。まず、背景情報を少し。データは IP カメラからのものです。データは、サードパーティ API を介してビデオ/オーディオ パケットとして表示されます。ビデオ パケットは、RTP ペイロード データ (ヘッダーなし) として提示され、再構築されて Annex B 形式の H.264 ビデオに変換される NALU で構成されます。AAC オーディオは未加工の AAC として表示され、再生を可能にするために adts 形式に変換されます。これらのパケットは、タイムスタンプ (1970 年 1 月 1 日から 64 ビット ミリ秒) の送信を可能にするビットストリーム形式に変換され、他のいくつかのものも含まれています。
これは多かれ少なかれプロトタイプであり、どの点においてもクリーンではありません。漏れが悪いのでしょう。ただし、これが他の誰かが私と同じようなことを達成しようとするのに役立つことを願っています.
グローバル:
主要:
ストリーム ストリーム/コーデックが追加され、addVideoAndAudioStream() という関数でヘッダーが作成されます。この関数は decodeIFrame() から呼び出されるため、いくつかの仮定があります (必ずしも良いとは限りません) 1. ビデオ パケットが最初に来る 2. AAC が存在する
decodeIFrame は、各 I Frame のサムネイルを作成していた別のプロトタイプのようなものでした。サムネイルを生成するコードは、https ://gnunet.org/svn/Extractor/src/plugins/thumbnailffmpeg_extractor.c からのものです。
decodeIFrame 関数は、AVCodecContext を addVideoAudioStream に渡します。
私が知る限り、いくつかの仮定は重要ではないように思われました。たとえば、次のようになります。 1. ビット レート。実際のビデオ ビット レートは ~262k でしたが、私は 512kbit 2. AAC チャンネルを指定しました。実際の出力はメモリからのステレオでしたが、モノラルを指定しました
ビデオとオーディオのフレーム レート (タイム ベース) を知る必要があります。
他の多くの例とは対照的に、ビデオ パケットに pts と dts を設定すると、再生できませんでした。タイムベース (25fps) を知る必要があり、そのタイムベースに従って pts と dts を設定する必要がありました。つまり、最初のフレーム = 0 (PPS、SPS、I)、2 番目のフレーム = 1 (中間フレーム、名前は何でも ;)) .
AAC また、16000 Hz であると仮定する必要がありました。オーディオの「オフセット」を決定するために、AACパケットごとに1024サンプル(AAC @ 960サンプルもあると思います)。これをpts&dtsに追加しました。したがって、pts/dts は、再生されるサンプル番号です。また、書き込む前に、パケットに 1024 の期間が設定されていることを確認する必要があります。
--
さらに今日、Annex B は他のプレーヤーと互換性がないことがわかったので、AVCC 形式を使用する必要があります。
これらの URL が役に立ちました: ffmpeg (libavcodec) を使用して H264 ビデオを RTP 経由でデコードする際 の問題
ビデオ ストリームを作成するときに、extradata と extradata_size を入力しました。
フレームを書き出すときは、SPS フレームと PPS フレームを先頭に追加せず、I フレームと P フレームだけを書き出します。さらに、最初の 4 バイト (0x00 0x00 0x00 0x01) に含まれる Annex B 開始コードを I/P フレームのサイズに置き換えます。
android - Android の ffmpeg の av_read_frame 関数は常に packet.stream_index を 0 として返す
ndk を使用して Android で ffmpeg を使用するために、以下に貼り付けた次の標準コード (参照: http://dranger.com/ffmpeg/ ) を使用しています。私のコードは、gcc コンパイラを使用して ubuntu 10.04 で正常に動作しています。しかし、私はアンドロイドで問題に直面しています。問題av_read_frame(pFormatCtx, &packet)
は常に返されることpacket.stream_index=0
です。さまざまな rtsp URL を使用してコードをテストしましたが、すべての場合で同じ動作をします。この問題以外はすべて正常に動作しているように見えるため、リンクやコンパイルの問題はありません。過去2日間からこれを解決しようとしていますが、ひどく行き詰まっています。正しい方向に向けてください。
android - ffmpeg でオーディオ ストリームを読み取れない
大きな問題を解決しようとしていますが、非常に小さな問題で立ち往生しています。ffmpeg を使用してビデオ ファイル内のオーディオ ストリームを読み取ろうとしていますが、ストリームのファイル全体をトラバースする必要があるループは数回しか実行されません。他の人が非常に同様に使用しているため、問題が何であるかを理解できません。以下は私のコードです確認してください:
ffmpeg - libavformat を使用して同じコーデックで 2 つのビデオ ファイルを連結する (再多重化) 方法は?
CDN からビデオを flv 形式 (ビデオ H264 およびオーディオ AAC) でダウンロードし、MP4 形式に再多重化しました。ただし、動画の長さには制限があります。そのため、各ビデオをいくつかの部分に分けてダウンロードしました。開始点、ポイント 1、ポイント 2 (URL のシーク パラメータを使用) で開始しました。各ポイントは、前のポイントの終わりより少し早く始まります。
iを使用av_read_frame
してすべての部分をスキャンしたところ、交差するパケットのサイズと順序が同じであるだけでなく、それらの dts/pts が定数値だけ互いにずれていることがわかりました。したがって、開始ビデオをポイント 1 で開始されたビデオと連結するには、次のことを行う必要があります。
1. 出力ファイルに出力ヘッダーを作成します
。 2. 交差しないすべてのパケットを開始ビデオからコピーします。
3. ポイント 1 で開始されたビデオから、dts 値を定数でシフトして変更されたすべての交差しないパケットをコピーします。
libav (ffmpeg ではない) を使用してこれらすべてを行うには? How can libavformat be used without using other libav librariesを読みました。しかし、libav
そこにないので、それは機能していませavformat_alloc_output_context2
んlibav
。また、ソースavconv.c
ソースは複雑すぎて、私のような初心者には、ストリーム コピー操作に関連する部分を分離できません。- input_file1と
input_file2を
開く(一般的なチュートリアルで手順が標準と異なる場合にのみ必要) -同じコンテナー形式と同じビデオおよびオーディオ形式でoutput_file
のヘッダーを開いて書き込む- input_file1からoutput_fileに
パケットを書き込む
たとえば、パケットまで-input_file2からoutput_filepos == XXX
に
パケットを書き込み、dts(または必要なもの)を定数値で変更します
-正しく書き込みますtrailer
前に作成した dts でのタイム シフトの計算。