我正在尝试使用FFMPEG库将AAC音频流写入mp4文件。我正在使用直接写入套接字的自定义IO上下文,因此必须进行设置ioContext->seekable = 0
。为了使这项工作,我不得不添加“movflags” empty_moov
,并frag_keyframe
在写标题。
将输出写入套接字另一端的文件后,可以在VLC或Windows Media Player中播放该文件。但是,在两个播放器中都无法找到文件中的特定位置。WMP也不显示总持续时间,并且VLC仅在到达音频结尾时立即闪烁。
混合时是否可以添加更多元数据,以便播放器能够将文件视为未作为流写入?通过套接字的传输不会突然中断,因此我可以在文件末尾写入元数据。我也提前知道了总持续时间,因此,如果可能的话,我可以将其添加到文件的标题中。我不能使用该faststart
标志,因为这将要求在写入套接字之前将其输出到可搜索的文件。
更新:我知道,我可以设置时间中AVFormatContext
,我可以设置nb_frames
和avg_frame_rate
中AVStream
。但是,它不能解决我的问题。当我设置codecContext标志时AV_CODEC_FLAG_QSCALE
,VLC似乎能够估计总时间。但是,搜索仍然行不通。
如果您想要一个可搜索的MP4文件,请确保它确实具有元数据,因为这对于MPEG解码器来说是处理搜索的必要条件(MP4元数据列出了每个AAC帧字节的起始位置。
这意味着丢失,-movflags empty_moov & frag_keyframe
因为它们增加了问题。
考虑:
frag_keyframe
因为所有音频帧都归为关键帧。empty_moov
因为MP4解码器无法查找是否没有元数据。(FFmpeg将在碎片模式下处理元数据)。写入碎片文件的优点是,即使写入中断,该文件也可解码(而正常的MOV / MP4如果未正确完成则无法解码),并且在写入很长的文件时需要较少的内存(由于写入普通的MOV) / MP4文件将有关每个单个数据包的信息存储在内存中,直到文件关闭为止。缺点是
less compatible with other applications
。
您可以尝试的选项是:
frag_duration [num]
创建num
几毫秒长的片段。frag_size [num]
创建最多包含num
有效载荷字节大小的片段。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句