Mp4格式分析:Adobe的sample1_1500kbps.f4v文件格式之三:mp4 to rtmp packets

本文详细介绍了如何将MP4格式的视频数据转换为RTMP流格式进行传输的过程。包括了如何读取MP4文件中的帧时间戳和类型,以及如何为这些数据添加额外的头部信息来适配RTMP/FLV格式的要求。

上篇文章讲了解析mp4的帧序列,这篇文章讲读取帧的时间戳和类型,以及打包成rtmp packet。

RTMP/FLV结构

mp4的mdat的video/audio数据,需要加上5个字节的头,打上时间戳后才能以rtmp包发送出去,rtmp包和flv的格式是一样的。

所以flv的包可以直接读取tag的data后发送,而mp4的数据需要在前面加5个字节的头后才能作为data发送出去。

下图是flv的结构:


其中,mp4的mdat读出来的数据,实际上是FlvVideoData这个结构。需要在前面加上FlvVideoTagHeader这个结构(5字节)。

frame_type

帧类型是1或2,表示I和P/B帧。

mp4的帧类型,由box(F4vSyncSampleBox,"stss",0x73747373)定义,在这个表中的是关键帧。

所以在读取track的信息时,需要把帧类型也读出来。

codec_id

对于h264视频而言,codec_id是7。

packet_type

对于packet_type,若为0表示是SequenceHeader,存储在box(F4vBox,"avcC",0x61766343)中的,包含了编码信息,是第一个包。同时composition time也是0。

composition_time

这个是在box(F4vCompositionTimeToSampleBox,"ctts",0x63747473)中定义的,在解析帧类型时需要读出来。

帧时间

每一帧的时间是固定的,在box(F4vDecodingTimeToSampleBox,"stts",0x73747473)中定义,例如:

sample_delta:1001(0x000003E9)

表示每帧是1001个时间单位。单位大小是在box(F4vMediaHeaderBox,"mdhd",0x6D646864)的timescale中定义,例如:

timescale:30000(0x00007530)

所以一帧是:0.0333666666666667秒=33.36666666666667毫秒。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

winlinvip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值