在流式传输/写入时,我可以同时读取mp4文件的前一部分吗?

时间:2013-02-14 09:47:40

标签: c++ video-streaming h.264 mpeg-4 live555

我正在使用基于Live555 / openRTSP的代码将H.264视频源流式传输到mp4文件,并希望同时读取文件的早期部分(来自不同的应用程序)。将fopen更改为fid = _fsopen(fileName, "wb", _SH_DENYWR)(来自OutputFile.cpp)显然是不够的,因为它没有任何区别,媒体播放器仍然无法打开它(是mp4的写入行)输出?)

在相关说明中,如果我模拟软件的不正常关闭(例如电源故障),则任何媒体播放器都无法读取未完成的文件。我假设在file-close上写入文件的内容是允许媒体播放器理解文件的内容。如果可能的话,这也是我想要编码的情况,并且很可能与上面的问题完全相同?

任何指针/答案/想法都很受欢迎: - )

2 个答案:

答案 0 :(得分:0)

您通常不会使用MP4来读取fopen(同样适用于许多其他格式)文件 - 就像API一样,而您使用的是库。反过来,它期望一个完整的文件,不要尝试恢复损坏的文件,或者读取仍在写入的文件。

因此,虽然在技术上可以在仍在编写时进行读取,但您不太可能在常规库,应用程序和播放器中取得成功。您需要先完成写入以使文件有效,可读和可播放 - 因为完成步骤会写入回放所需的索引。

答案 1 :(得分:0)

如果有人需要相同的话,我就是这样做的,而且比我想象的要容易:

  • 将OutputFile.cpp中的fopen更改为文件共享调用_fsopen (分享阅读权限)
  • 每隔10秒钟 QuickTimeFileSink::continuePlaying()函数我调用completeOutputFile(),从而使标题保持最新(视频长度等)。

Windows Media Player不喜欢它(可能试图获得独占文件访问权限),但VLC很高兴在我还在流入时读取该文件。