5

H.264 AnxB フレームがリアルタイムの会話から入ってくると想像してください。後続の再生のタイミング情報を維持しながら、MPEG2 トランスポート ストリームにカプセル化する最良の方法は何ですか?

libavcodec および libavformat ライブラリを使用しています。AVCodecContext 型のオブジェクト (*pcc) へのポインタを取得したら、foll を設定します。

pcc->codec_id = CODEC_ID_H264;
pcc->bit_rate = br;
pcc->width = 640;
pcc->height = 480;
pcc->time_base.num = 1;
pcc->time_base.den = fps;

NAL ユニットを受信したら、AVPacket を作成し、av_interleaved_write_frame() を呼び出します。

AVPacket pkt;
av_init_packet( &pkt );
pkt.flags |= AV_PKT_FLAG_KEY;   
pkt.stream_index = pst->index;
pkt.data = (uint8_t*)p_NALunit;
pkt.size = len;

pkt.dts = AV_NOPTS_VALUE;
pkt.pts = AV_NOPTS_VALUE;

av_interleaved_write_frame( fc, &pkt );

基本的に2つの質問があります:

1) 可変フレームレートの場合、フォールを指定しない方法はありますか? pcc->time_base.num = 1; pcc->time_base.den = fps; 可変フレームレートを示すものに置き換えますか?

2) パケットを送信する際、pkt.dts と pkt.pts にどの「タイムスタンプ」を割り当てるべきですか?

現在、ffplay を使用して出力を再生すると、上記のコードで使用する一定のフレームレート (fps) で再生されます。

また、さまざまな空間解像度に対応する方法を知りたいです。私が受信したストリームでは、各キーフレームの前に SPS と PPS があります。空間解像度が変わるときはいつでも知っています。pcc->width = 640; を指定する必要がない方法はありますか? pcc->高さ = 480; 前もって?つまり、空間解像度がストリームの途中で変化する可能性があることを示します。

どうもありがとう、エディ

4

1 に答える 1

0

DTS と PTS は 90 KHz クロックで測定されます。ISO 13818 パート 1 セクション 2.4.3.6 の構文テーブルの下を参照してください。

可変フレーム レートに関しては、フレームワークにこれを生成する方法がある場合とない場合があります (vui_parameters.fixed_frame_rate_flag=0)。再生ソフトウェアがそれを処理するかどうかは、まったく別の問題です。ほとんどのプレーヤーは、PTS または DTS に関係なく、固定フレーム レートを前提としています。mplayer は、ffmpeg によって生成された固定レートのトランスポート ストリームのフレーム レートを正しく計算することさえできません。

解像度を変更する場合は、ストリームを終了して (nal_unit_type 10 または 11)、新しいシーケンスを開始する必要があると思います。同じトランスポート ストリーム内にある可能性があります (クライアントが単純すぎないと仮定します)。

于 2012-05-02T21:54:13.627 に答える