3

cコードでFFMPEGAPIを使用してビデオをトランスコードしています。以下に示すように、ffmpegAPIを使用してビデオビットレートを設定しようとしています。

ovCodecCtx->bit_rate = 100 * 1000;

私が使用しているエンコーダーはlibx264です。

ただし、このパラメータは有効にならず、結果のビデオ品質は非常に悪くなります。rc_min_rate、rc_max_rateなどの関連パラメータを設定しようとしましたが、これらの関連パラメータが有効になっていないため、ビデオ品質はまだ非常に低くなっています。

専門家は、FFMPEG APIを使用してビットレートを正しく設定する方法を教えてもらえますか?ありがとう

4

1 に答える 1

2

私は自分の問題の解決策を見つけました。実際、同じ問題に直面していた誰かがffmpeg(libav)ユーザーフォーラムに解決策を投稿しました。これは私の場合もうまくいくようです。同様の問題に直面している他のユーザーがこの投稿の恩恵を受けることができるように、私は自分の質問に対する回答を投稿しています。

問題:

H264ビデオコーデックのビデオビットレートをプログラムで設定することは、libx264コーデックによって尊重されませんでした。MPEG1、2、およびMPEG4ビデオコーデックでは機能していましたが、この設定はH264ビデオコーデックでは認識されませんでした。そして、結果として得られたビデオ品質は非常に悪かった。

解決:

デコーダーに送られる前に、デコード/サイズ変更されたフレームのポイントを設定する必要があります。解決策を見つけた人はffmpeg.cソースを調べて、これを理解することができました。最初に、AVFrameのポイントをストリームのtime_baseからコーデックのtime_baseに再スケーリングして、単純なフレーム番号(1、2、3など)を取得する必要があります。

pic->pts = av_rescale_q(pic->pts, ost->time_base, ovCodecCtx->time_base);

avcodec_encode_video2(ovCodecCtx, &newpkt, pic, &got_packet_ptr);

また、libx264コーデックからエンコードされたパケットを受信するときは、エンコードされたビデオパケットのptsとdtsをストリームタイムベースに再スケーリングする必要があります。

newpkt.pts = av_rescale_q(newpkt.pts, ovCodecCtx->time_base, ost->time_base);
newpkt.dts = av_rescale_q(newpkt.dts, ovCodecCtx->time_base, ost->time_base);

ありがとう

于 2012-08-07T11:52:15.333 に答える