封装H.264流可变帧速率在MPEG2传输流中

时间:2012-04-04 18:03:20

标签: ffmpeg h.264 mpeg2-ts

想象一下,我从实时对话中获得了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 );

我基本上有两个问题:

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; 前期?换句话说,表明空间分辨率可以在流中改变。

非常感谢, 埃迪

1 个答案:

答案 0 :(得分:0)

DTS和PTS以90 KHz时钟测量。请参阅语法表下方的ISO 13818第1部分第2.4.3.6节。

对于可变帧速率,您的框架可能有也可能没有办法生成它(vui_parameters.fixed_frame_rate_flag = 0)。回放软件是否处理它是一个完全不同的问题。无论PTS还是DTS,大多数玩家都采用固定的帧速率。对于ffmpeg生成的固定速率传输流,mplayer甚至无法正确计算帧速率。

我认为如果您要更改分辨率,则需要结束流(nal_unit_type 10或11)并启动新序列。它可以在同一个传输流中(假设您的客户端不太简单)。