想象一下,我从实时对话中获得了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; 前期?换句话说,表明空间分辨率可以在流中改变。
非常感谢, 埃迪
答案 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)并启动新序列。它可以在同一个传输流中(假设您的客户端不太简单)。