使用FFMPEG将可搜索的AAC音频流写入MP4文件

lex82

我正在尝试使用FFMPEG库将AAC音频流写入mp4文件。我正在使用直接写入套接字的自定义IO上下文,因此必须进行设置ioContext->seekable = 0为了使这项工作,我不得不添加“movflags” empty_moov,并frag_keyframe在写标题。

将输出写入套接字另一端的文件后,可以在VLC或Windows Media Player中播放该文件。但是,在两个播放器中都无法找到文件中的特定位置。WMP也不显示总持续时间,并且VLC仅在到达音频结尾时立即闪烁。

混合时是否可以添加更多元数据,以便播放器能够将文件视为未作为流写入?通过套接字的传输不会突然中断,因此我可以在文件末尾写入元数据。我也提前知道了总持续时间,因此,如果可能的话,我可以将其添加到文件的标题中。我不能使用该faststart标志,因为这将要求在写入套接字之前将其输出到可搜索的文件。

更新:我知道,我可以设置时间中AVFormatContext,我可以设置nb_framesavg_frame_rateAVStream但是,它不能解决我的问题。当我设置codecContext标志时AV_CODEC_FLAG_QSCALE,VLC似乎能够估计总时间。但是,搜索仍然行不通。

VC一

如果您想要一个可搜索的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从mp4文件ffmpeg删除音频

无法使用ffmpeg从mp4文件创建音频文件

从视频的特定时间开始,使用ffmpeg流mp4文件

从MP4文件提取AAC音频的“正确”方法?

递归搜索.mp4文件并使用ffmpeg处理它们

在mp4文件中只延迟一个通道的音频流

如何使用ffmpeg将WebM音频(Opus)和MP4视频(H.264)合并为一个MP4文件

从FFMPEG mp4直播流m3u8文件?

与多个mp4文件的ffmpeg分段到HLS流

如何在不解压的情况下使用ffmpeg从mp4文件中批量提取音频(自动音频编解码器检测)?

用ffmpeg中的mp3的一部分替换mp4文件的音频

使用ffmpeg将mp4文件夹转换为mp3?

使用FFMPEG来组合MP4和MP3文件?

使用python分别获取Mp4文件的视频和音频比特率?

C ++ FFmpeg创建mp4文件

不使用ffmpeg将flv文件转换为mp4文件

ffmpeg删除mp4文件中的一部分音频,但不是全部

如何使用ffmpeg使用Node.js来流式传输MP4文件?

使用FFmpeg从WMV到MP4文件的转换失败

使用ffmpeg分割mp4文件会导致黑色视频

如何使用FFmpeg连接两个MP4文件?

如何使用ffmpeg从mp4文件中提取特定的音轨(音轨2)?

如何使用ffmpeg从.mp4文件中删除几秒钟?

将.mp4音频文件另存为mp3文件

使用ffmpeg从mp4中提取AAC LC音频

在iOS中的mp4文件中随机访问和解码AAC音轨

如何通过S / PDIF用AAC 5.1播放MP4文件

ffmpeg在命令行上使用ffmpeg加入两个mp4文件

使用AVAssetReader读取mp4文件时,第一个音频CMSampleBuffer丢失