MP4 to HLS based on nginx-http-mp4-module
这里列出了我在基于nginx-http-mp4-module开发MP4直出HLS流时遇到的坑,哎,说多了都是泪啊……
希望对你有帮助,如果你发现了一些没有列出来的问题,欢迎反馈,你知道怎么联系我的。
SPS和PPS何时发送?
IDR(nalu_type=5)之前发送
PMT和PAT如何构造?
PMT和PAT为固定字段,每ts发送一次即可。
加入条带分割NAL头部对现有的H.264数据有何影响?
目前看无影响,每一sample前发送条带分割NAL(nalu_type=9)
码流和网络流形式的NAL在转换时需要注意哪些?
一般情况下发送0x00 00 00 01,仅在sample的非首slice时发送0x00 00 01
AAC头部是否需要修改?
AAC需要使用ADST封装
ADST包含哪些参数?从MP4文件的何box中读取参数?
profile: (object_type - 1)
sampling frequency: sample_rate_index
channel configuration: channels
通过mp4a->esds读取上述参数
音频数据如何汇总成一个PES包再发送,而不是每一个sample封装一个PES?
音频打包到一个PES再发送,大小为2930
生成m3u8时如何分割?
以GOP为分割
aac的duration为什么固定是1024?遇到非固定duration的aac应如何处理?
aac规定每个frame包含1024个samples;忽略stts中的delta,固定输出1024
MP4中的elst atom应如何处理?
pts -= elst_start_time
dts -= elst_start_time
http://wiki.multimedia.cx/index.php?title=QuickTime_container#elst
WARNING: Unable to read video timestamps in track 1; this may be due to not having a key frame in this segment.
dts时间戳不为0即可,apple提供的切片工具(mediafilesegmenter),使用的是10秒前缀;
某些安卓平台的播放器,不支持非0开始的流,比如UC,遨游和小米自带的浏览器等等,表现为播放视频时自动跳到10秒之后播放。
PAT中最重要的字段
PMT的PID,其他字段一般不变
PMT中最重要的字段
PID
PCR PID
音频类型
音频PID
视频类型
视频PID
PAT和PMT中的continuity counter是否需要递增?
建议连续,以兼容某些平台,比如安卓
音、视频的continuity counter是否需要递增?
iOS平台和Mac平台的safari浏览器能够处理continuity counter跳跃,但是安卓的自带浏览器不行,如果安卓平台也在考虑范围内,最好安安分分的处理continuity counter