2012-04-04 131 views
5

想象一下,我有來自實時對話的H.264 AnxB幀。在保留後續播放的定時信息的同時封裝在MPEG2傳輸流中的最佳方式是什麼?在MPEG2傳輸流中封裝H.264流可變幀率

我正在使用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); 

我基本上有兩個問題:

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;預先設定爲 ?換句話說,表明空間分辨率可以在中游改變。

非常感謝, 埃迪

回答

0

DTS和PTS在90千赫時鐘被測量。參見ISO 13818第1部分第2.4.3.6節下方的語法表。

至於可變幀率,你的框架可能或可能沒有辦法產生這個(vui_parameters.fixed_frame_rate_flag = 0)。播放軟件處理它是一個完全不同的問題。無論PTS或DTS如何,大多數玩家都會採用固定的幀速率。對於由ffmpeg生成的固定速率傳輸流,mplayer甚至無法正確計算幀速率。

我想如果你要改變你需要的分辨率來結束流(nal_unit_type 10或11)並開始一個新的序列。它可以位於相同的傳輸流中(假設您的客戶端不太簡單)。