ireader / media-server

RTSP/RTP/RTMP/FLV/HLS/MPEG-TS/MPEG-PS/MPEG-DASH/MP4/fMP4/MKV/WebM
MIT License
3.06k stars 1.07k forks source link

mov_reader_test怎么读取hls+fmp4 #312

Open BreakingY opened 11 months ago

BreakingY commented 11 months ago

大佬,我现在使用hls+fmp4做项目,解析完m3u8之后把init.mp4 1.m4s 2.m4s 3.m4s ...所有文件都下载下来了,应该怎么通过mov_reader_test解析音视频数据,就把init.mp4 1.m4s 2.m4s 3.m4s ...按照顺序拼接在一起就可以了吗?

BreakingY commented 11 months ago

如果是拼接之后给mov读取,我还有一点不明白: 写i.m4s的时候 tfhd: 如果flag & MOV_TFHD_FLAG_BASE_DATA_OFFSET 则记录了该moof在当前片段文件(i.m4s)的绝对偏移量 如果flag & MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF则在实际读取文件的时候确定moof的偏移 trun: 如果flags & MOV_TRUN_FLAG_DATA_OFFSET_PRESENT则记录sample相对moof的相对偏移量

把init.mp4 1.m4s 2.m4s 3.m4s ...拼接到一起之后libmov读取的时候: MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF(tfhd)+MOV_TRUN_FLAG_DATA_OFFSET_PRESENT(trun) 则data_offset = track->tfhd.base_data_offset(moof在拼接后的文件中的绝对偏移量)+data_offset(trun) 这种flag组合拼接后可以准确定位到拼接后sample的偏移 虽然在fmp4_writer的时候就是用的MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF(tfhd)+MOV_TRUN_FLAG_DATA_OFFSET_PRESENT(trun)的组合,但是如果其他软件不使用这种flag组合方式,那拼接后libmov是不是就不能正确解析了呢 是确实存在这种情况还是我理解的不对呢

ireader commented 11 months ago
  1. fmp4分片模式应该都是使用的相对偏移地址。

  2. 拼接读的问题, 不需要把所有的i.mp4拼接在一起。可以先把init.mp4保存在内存中, 然后实现自定义的mov reader, 每次读取数据时, 偏移地址加上init.mp4文件长度。

BreakingY commented 11 months ago

明白了,我在看hls的时候发现一个问题,不能算bug,算是fpm4的一个使用问题 在libhls/hls-fmp4.c中hls_fmp4_destroy if (hls->mp4) { fmp4_writer_destroy(hls->mp4); hls->mp4 = NULL; } 调用fmp4_writer_destroy之后应该加上下面的语句把最后的一个分片保存下来,fmp4_writer_destroy会把最后的片段数据保存下来, 应用在fmp4_writer_destroy之后需要对最后的分段做收尾处理,否则最后分段的数据会丢失,hls这里就表现为最后一个片段的视频没有保存下来,m3u8中也没有这个分段的信息,媒体结尾的几秒钟就丢失了 int64_t duration = hls->dts_last - hls->dts; hls->handler(hls->param, hls->ptr, hls->bytes, hls->pts, hls->dts, duration);

ireader commented 11 months ago

感谢指正!