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 );

我基本上有两个问题:

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->高度 = 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 回答