1

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

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

收到任何指示/答案/想法:-)

4

2 回答 2

0

万一有人需要同样的东西,我就是这样做的,而且比我想象的要容易:

  • 将 OutputFile.cpp更改fopen为文件共享调用_fsopen (共享读取访问)
  • QuickTimeFileSink::continuePlaying()在我调用的函数中每 10 秒一次 completeOutputFile(),从而使标题保持最新(包括视频长度等)。

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

于 2013-02-14T11:46:05.597 回答
0

您通常不会MP4使用 -like API 从文件中读取(对于许多其他格式也是如此)fopen,而是使用库。反过来,它期望一个完整的文件并且不要尝试恢复损坏的文件,或读取仍在写入的文件。

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

于 2013-02-14T10:51:05.887 回答