use*_*600 5 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;
Run Code Online (Sandbox Code Playgroud)
当我收到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 );
Run Code Online (Sandbox Code Playgroud)
我基本上有两个问题:
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; 前期?换句话说,表明空间分辨率可以在中游改变.
非常感谢,艾迪
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)并开始新的序列。它可以位于同一个传输流中(假设您的客户端不太简单)。
| 归档时间: |
|
| 查看次数: |
2708 次 |
| 最近记录: |