GStreamer可以使用如下管道输出单个文件的片段化MP4:
❯ gst-launch-1.0 filesrc location=../test.ts ! decodebin ! x264enc ! ismlmux fragment-duration=6000 faststart=1 ! filesink location=fragmented.mp4使用Bento4,我们可以确认该文件包含交错的moof原子和mdat原子(我只是过滤顶级原子,因为完整的输出非常长):
❯ mp4dump fragmented.mp4 | egrep '^[^ ]'
[ftyp] size=8+16
[moov] size=8+833
[moof] size=8+5112
[mdat] size=8+538271
[moof] size=8+2964
[mdat] size=8+296190
[moof] size=8+5112
[mdat] size=8+484946
[moof] size=8+2964
[mdat] size=8+305615
[moof] size=8+5112
[mdat] size=8+482052
[moof] size=8+2964
[mdat] size=8+298039
[moof] size=8+5112
[mdat] size=8+478313
[moof] size=8+2964
[mdat] size=8+294548
[moof] size=8+5112
[mdat] size=8+483575
[moof] size=8+2964
[mdat] size=8+303894
[moof] size=8+5112
[mdat] size=8+483527
[moof] size=8+2964
[mdat] size=8+316919使用Bento4,我们还可以将文件分割成单独的文件--包含初始元数据的init.mp4,以及每个moof+mdat对的文件。
❯ mp4split fragmented.mp4
❯ ls
fragmented.mp4 segment-1.0001.m4s segment-1.0003.m4s segment-1.0005.m4s segment-1.0007.m4s segment-1.0009.m4s segment-1.0011.m4s
init.mp4 segment-1.0002.m4s segment-1.0004.m4s segment-1.0006.m4s segment-1.0008.m4s segment-1.0010.m4s segment-1.0012.m4s
❯ mp4dump init.mp4 | egrep '^[^ ]'
[ftyp] size=8+16
[moov] size=8+833
[udta] size=8+53
[mvex] size=8+52
❯ mp4dump segment-1.0001.m4s | egrep '^[^ ]'
[moof] size=8+5112
[mdat] size=8+538271然而,mp4split首先需要完整的文件来分割它,我需要支持实时流,这意味着这种方法是不可行的。是否有一种方法可以直接从GStreamer?将fMP4拆分成多个文件
我尝试了分裂汇,但它似乎产生了单独可播放的独立MP4文件,而不是片段。我还尝试使用多文件墨迹来保存碎片MP4,但是似乎没有一种方法可以告诉它在特定原子上拆分文件。
发布于 2022-11-09 06:00:49
可以为mp4mux/qtmux/matroskamux设置以下几个属性:
Splitmux接收器muxer='mp4mux faststart=true streamable=true片段-持续时间=1000个跟踪时间刻度=1000个电影时间刻度=1000个呈现时间=真‘ max-size-time=1000000000 location=file%02d.mp4
https://stackoverflow.com/questions/72662462
复制相似问题