2012-04-04 17 views
5

リアルタイムの会話からH.26​​4 AnxBフレームを受信したとします。次の再生のタイミング情報を維持しながらMPEG2トランスポートストリームにカプセル化する最良の方法は何ですか?H.264ストリームをカプセル化するMPEG2トランスポートストリームで可変フレームレートを使用する

私はlibavcodecとlibavformatライブラリを使用しています。 AVCodecContext型のオブジェクト(* pcc)へのポインタを取得すると、私はそのオブジェクトを設定します。

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)変数フレームレートに関しては、follを指定しないようにする方法があります。 pcc-> time_base.num = 1; pcc-> time_base.den = fps; これを可変フレームレートを示す何かに置き換えますか?

2)パケットを送信しているうちに、 pkt.dtsとpkt.ptsにどのタイムスタンプを割り当てる必要がありますか?

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

さまざまな空間解像度に対応する方法も知りたいです。私が受け取るストリームでは、各キーフレームの前にSPSとPPSがあります。空間解像度が変わるたびに私は知っています。 ここに指定する必要はありません。 pcc-> width = 640; pcc-> height = 480; upfront?換言すれば、空間分解能が中間ストリームに変化し得ることを示す。

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

答えて

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)を終了して新しいシーケンスを開始する必要があると思います。同じトランスポートストリームに入れることもできます(クライアントが単純すぎると仮定して)。

関連する問題