Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mov_reader_test怎么读取hls+fmp4 #312

Open
BreakingY opened this issue Oct 12, 2023 · 4 comments
Open

mov_reader_test怎么读取hls+fmp4 #312

BreakingY opened this issue Oct 12, 2023 · 4 comments

Comments

@BreakingY
Copy link

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

@BreakingY BreakingY changed the title mov_reader_test怎么读取fmp4 mov_reader_test怎么读取hls+fmp4 Oct 12, 2023
@BreakingY
Copy link
Author

如果是拼接之后给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
Copy link
Owner

ireader commented Oct 12, 2023

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

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

@BreakingY
Copy link
Author

明白了,我在看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
Copy link
Owner

ireader commented Oct 12, 2023

感谢指正!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants