我正在摄取一个RTMP流,并将其转换为JavaScript中的一个片段MP4文件。这项工作花了一周时间,但我几乎完成了这项任务。我正在生成一个有效的
ftyp
原子
moov
原子,和
moof
atom和视频的第一帧在进入无限缓冲区之前(与音频一起)实际播放,其中没有列出错误
chrome://media-internals
ffprobe
,我得到一个类似以下的错误:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x558559198080] Failed to add index entry
Last message repeated 368 times
[h264 @ 0x55855919b300] Invalid NAL unit size (-619501801 > 966).
[h264 @ 0x55855919b300] Error splitting the input into NAL units.
tfhd
和
trun
驼鹿
原子
然后,我将原始FLV文件转换为MP4格式
ffmpeg
使用以下命令:
ffmpeg -i ~/Videos/rtmp/big_buck_bunny.flv -c copy -ss 5 -t 10 -movflags frag_keyframe+empty_moov+faststart test.mp4
我打开了我正在创建的MP4和
ffmpeg
在atom解析文件中,并比较了以下两种情况:
我首先想到的是
-生成的文件每个文件有多个视频样本
驼鹿
. 具体来说
从1个关键帧开始,然后包含所有差异帧,直到下一个关键帧(用作以下关键帧的开始)
原子)
将此与我生成MP4的方式进行对比。我创建了一个
原子每一次一个FLV
VIDEODATA
包裹到了。这意味着我的
驼鹿
可能不包含关键帧(通常不包含)
这就是我遇到麻烦的原因吗?还是我还遗漏了什么?
有关视频文件可在此处下载:
我注意到的另一个问题是
ffmpeg
大量使用
base_data_offset
tfhd
原子但是,当我尝试跟踪附加的总字节数并设置
基本数据偏移量
我自己,我在Chrome上犯了一个错误,大意是:“MSE不支持基本数据偏移”。根据ISO/IEC 14996-10规范:
如果未提供,则电影片段中第一个曲目的基本数据偏移量是封闭的电影片段框的第一个字节的位置,对于第二个和后续的曲目片段,默认值是前面片段定义的数据的结尾。
这句话让我相信
data_offset
首先
特鲁恩
原子应该等于原子的大小
驼鹿
原子与原子
第二
原子应该是
0
做
驼鹿
atom加上第一个磁道的总长度(就好像基偏移量是封闭磁道的第一个字节一样)
驼鹿
框,与第一个轨迹相同)