【问题标题】:Can I concurrently read an earlier section of an mp4 file while streaming/writing into it?我可以在流式传输/写入时同时读取 mp4 文件的早期部分吗?
【发布时间】:2013-02-14 09:47:40
【问题描述】:
我正在使用基于 Live555/openRTSP 的代码将 H.264 视频源流式传输到 mp4 文件,并希望同时读取文件的早期部分(来自不同的应用程序)。将fopen 更改为fid = _fsopen(fileName, "wb", _SH_DENYWR)(来自OutputFile.cpp)显然是不够的,因为它没有任何区别并且媒体播放器仍然不会打开它(那是mp4 输出的写入行吗?)
在相关说明中,如果我模拟软件的非正常关闭(例如电源故障),则任何媒体播放器都无法读取未完成的文件。我假设文件关闭时写入文件的内容是允许媒体播放器理解文件的内容。如果可能的话,这也是我想编写代码的情况,并且很可能与上述问题完全相同?
收到的任何指示/答案/想法:-)
【问题讨论】:
标签:
c++
video-streaming
h.264
mpeg-4
live555
【解决方案1】:
您通常不会使用fopen-like API 从MP4(许多其他格式也适用)文件中读取,而是使用库。反过来,它期望一个完整的文件并且不要尝试恢复损坏的文件,或读取仍在写入的文件。
因此,虽然从技术上讲,可以在编写过程中进行阅读,但对于常规库、应用程序和播放器,您不太可能在这方面取得成功。您需要先完成写入以使文件有效、可读和可播放 - 因为完成步骤会写入播放所需的索引。
【解决方案2】:
如果有人需要同样的东西,我就是这样做的,而且比我想象的要容易:
- 将 OutputFile.cpp 中的
fopen 更改为文件共享调用 _fsopen
(共享读取权限)
- 每隔 10 秒
QuickTimeFileSink::continuePlaying() 函数我调用 completeOutputFile(),从而使标题保持最新(包括视频长度等)。
Windows Media Player 不喜欢它(可能试图获得独占文件访问权限),但 VLC 很高兴在我仍在流式传输文件时读取文件。