想象一下,我有来自实时对话的 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;前期?换句话说,表明空间分辨率可以在中途改变。
非常感谢,埃迪