我正在尝试使用FFMPEG库将AAC音频流写入mp4文件。我使用了一个自定义的IO上下文,直接写入套接字,所以我必须设置
在将输出写入套接字另一端的文件之后,我可以在VLC或Windows Media Player中播放该文件。然而,在这两个播放器中,定位到文件中的特定位置并没有正常工作。WMP还没有显示总持续时间,当VLC达到音频结束时只会短暂地闪烁一下。
有没有一种方法可以在混合时添加更多元数据,以便播放器能够像处理非流式写入的文件一样处理它?通过套接字传输不会突然中断,因此我可以在文件末尾写入元数据。我也知道预先知道总持续时间,因此如果可能,我可以将其添加到文件头中。但我不能使用
更新:我了解到可以在
ioContext->seekable = 0
。为了使其工作,我必须在写入头部时添加“movflags”empty_moov
和frag_keyframe
。在将输出写入套接字另一端的文件之后,我可以在VLC或Windows Media Player中播放该文件。然而,在这两个播放器中,定位到文件中的特定位置并没有正常工作。WMP还没有显示总持续时间,当VLC达到音频结束时只会短暂地闪烁一下。
有没有一种方法可以在混合时添加更多元数据,以便播放器能够像处理非流式写入的文件一样处理它?通过套接字传输不会突然中断,因此我可以在文件末尾写入元数据。我也知道预先知道总持续时间,因此如果可能,我可以将其添加到文件头中。但我不能使用
faststart
标志,因为这需要在写入套接字之前输出到可寻址文件。更新:我了解到可以在
AVFormatContext
中设置持续时间,并且可以在AVStream
中设置nb_frames
和avg_frame_rate
。但这并不能解决我的问题。当我设置codecContext标志AV_CODEC_FLAG_QSCALE
时,VLC似乎能够估计总时间。然而,仍然无法正常工作。
-movflags empty_moov
并阅读其余部分)。所以您描述了问题,但应用程序的上下文是什么?正在接收音频并且想要构建一个MP4直到X数量然后保存到文件吗?为什么不先缓冲所有所需的AAC,然后只编码为最终的MP4?无论如何,请考虑以下几点:#所有音频帧都是关键帧,#如果没有元数据,MPEG解码器无法查找,#尝试使用M4a输出,然后重命名为MP4? - VC.Oneffmpeg -i - -c:a libfdk_aac -b:a 128k output.mp4
,这里我将使用-i -
告诉它没有输入文件,而是只需重复写入每个AAC帧的字节到process.writeBytes(myAACframe);
,直到AAC结束为止,然后退出进程并生成可播放的文件。简而言之,通过追加可用的AAC帧来动态构建MP4文件。也许这种逻辑能对您有所帮助? - VC.One-movflags empty_moov & frag_keyframe
,因为它们会加重问题)。我建议使用“process”方法,因为这是一个简单的测试,无需担心您的完整代码是否正确(例如:nb_frames
等)。它可以在C++、Java或C#中完成,具体取决于您的语言... - VC.One