lex*_*x82 5 audio streaming mp4 ffmpeg aac
我正在尝试使用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字节大小的有效负载的片段。| 归档时间: |
|
| 查看次数: |
1384 次 |
| 最近记录: |