問題タブ [swscale]
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.
h.264 - カメラからの入力画像を H.264 ストリームにエンコードする方法は?
Mac OS X 10.9.5 で libx264 を使用して、MacBook Pro の内蔵 FaceTime HD カメラからの入力画像をリアルタイムで H.264 ビデオ ストリームにエンコードしようとしています。
以下は私が取ったステップです:
- AVFoundation API (AVCaptureDevice クラスなど) を使用して、15fps でカメラから 1280x720 32BGRA 画像を取得します。
- libswscale を使用して、画像を 320x180 YUV420P 形式に変換します。
- libx264 を使用して、画像を H.264 ビデオ ストリーム (ベースライン プロファイル) にエンコードします。
カメラから画像を取得するたびに上記の手順を適用します。エンコーダーはエンコード状態を追跡し、利用可能になったときに NAL ユニットを生成すると信じています。
エンコーダーに入力画像を提供しながらエンコードされたフレームを取得したかったので、30 フレーム (2 秒) ごとにエンコーダーをフラッシュする (x264_encoder_delayed_frames() を呼び出す) ことにしました。
ただし、エンコードを再開すると、しばらくするとエンコーダーが停止します (x264_encoder_encode() は決して戻りません)。フラッシュする前のフレーム数を変更してみましたが、状況は変わりませんでした。
以下に関連するコードを示します(画像キャプチャのコードは問題ないようなので省略します)。
私が間違っているかもしれないことを指摘できますか?
ffmpeg - swscaler@0dd9e620: 非推奨のピクセル形式が使用されています。範囲を正しく設定したことを確認してください"
FFMpeg で RTSP ビデオ ストリームをデコードしています。表示時 ( への呼び出しcv::imshow(...)
) に、次の例外が発生します。
[swscaler @ 0d55e5c0] 非推奨のピクセル形式が使用されています。範囲を正しく設定したことを確認してください
ピクセル形式を「AV_PIX_FMT_YUVJ420P」から「AV_PIX_FMT_YUV420P」に変換しています。上記の例外がまだ発生しています。どんな助けでも大歓迎です。
c++ - SWScaleを使用したFFMpeg RGB32からNV12へ
RGB32 フレームを NV12 フレームに変換して、エンコーダーにフィードしようとしています。
m_outputPixelFormat AV_PIX_FMT_RGB32 を作成し、DMO 色空間コンバーターを使用すると、ビデオは正しく出力されます。ただし、NV12 に変更すると、下部にデータが欠落した斜めのビデオが表示されます。これは、バッファからデータを誤ってコピーしたことが原因であることはわかっていますが、何が間違っているのかわかりません。
c++ - AVFrame に負の線サイズがあります
libav (MSVC 用にビルドされた 2.7) を使用して、dshow を使用してカメラを開きます。
ビデオストリームを開くと、それはフォーマットの「生のビデオ」(その によるlong_name
)ですAV_PIX_FMT_BGR24
。フレームが必要なAV_PIX_FMT_RGB24
ので、次のように SwsContext を作成します。
次に、ループ タイマーを使用してフレームを読み取り、AVFrame にデコードします。AVFrame は、sws_scale に渡されます。
この時点の後av_picture
、アプリケーションで使用しますが、sws_scale
ハングしてクラッシュします。何も入っていないすべてのデータを見ると、 のラインサイズをsws_scale
除いて奇妙に見えます。(とは の予想どおり 0 です)。私のフレームの幅は 640 なので、1920 を期待しますが、負の符号は非常に奇妙に思えます。サインをひっくり返してみましたが、役に立ちません。毎回クラッシュするわけではないことに注意してください (一部の実行では、最初に数フレーム通過します)。av_frame
av_frame->linesize[0] == -1920
linesize[1]
linesize[2]
BGR24
ラインサイズが負になるのはなぜですか? それは何かを意味していますか、それともどういうわけか台無しにされていますか?
c++ - フレームをデコードして取得するためにffmpegでDXVA2を使用する方法
Windowsでffmpegを使用してH264ストリームをハードウェアアクセラレーションでデコードする方法に関する簡単な例を検索しましたが、見つかりませんでした。ハードウェアアクセラレーションを実現するには、ffmpeg で dxva2 を使用する必要があることを知っています。
投稿で提供されているサンプル プロジェクトのおかげで、CPU で ffmpeg を使用して H264 をデコードし、NV12 形式を RGBA に変換して、フレームを bmp ファイルとして保存できます。
dxva2 に関するヘルプを得るために、次の投稿で提供されている内容に従いました。
dxva2 で正常にデコードできると思います。ただし、デコードされたフレームを取得して RGBA 形式に変換し、bmp ファイルとして保存しようとすると、ソース ポインターに関するエラーが発生します。
次のようにフレームをデコードして取得します。
出力フレームを次の場所にフィードします。
次のエラーが表示されます。
[swscaler @ 030c5c20] 不正な src イメージ ポインター
明らかに何かがおかしいのですが、pFrameYuv->data
何が原因かわかりません。
DXVA2 でデコードされた NV12 フレームを sws_scale で RGBA に変換するにはどうすればよいですか?