如何在 mp4 视频文件中添加 MOOV 原子

Posted

技术标签:

【中文标题】如何在 mp4 视频文件中添加 MOOV 原子【英文标题】:How to add a MOOV atom in a mp4 video file [closed] 【发布时间】:2012-07-16 10:49:33 【问题描述】:

我正在开发实时设备到 android 中的服务器流式传输。我可以在服务器上以字节为单位发送数据,但是当我在服务器 VLC 上录制期间播放该文件时说找不到 MOOV 原子。经过大量解决方法后,我发现 MOOV mp4 文件的原子最终生成。但是我必须在服务器上播放该文件,同时录制意味着直播。我浏览了 SPYDROIDSIPDROID 的源代码,但它们都不起作用。我尝试使用 FFMPEG 在服务器端添加moov atom,但没有成功。任何人都知道我该如何实现这一目标?

【问题讨论】:

Post processing in ffmpeg to move 'moov atom' in MP4 files (qt-faststart)的可能重复 我可以使用 ffmpeg 解决我在 Plex 上播放电视剧的问题吗?日志表明: 为了更清楚地说明,我在树莓派 4 上运行我的 plex 和 nas 服务器。我正在使用“MacX DVD Ripper Pro”来翻录视频。我搬到了最新版本的 plex (1.21.1.3830),它应该允许新的扫描仪 【参考方案1】:

运行 qt_faststart 将 moov atom 移动到流的开头。

qt-faststart in.mp4 out.mp4

【讨论】:

嗨 d33pika..thnx 给你的 rply,我想在录制时在服务器上发送视频数据,但是录制完成后会生成一个 moov atom,这就是为什么我认为 qt-faststart 在这里没有帮助的原因。 你的问题解决了吗@Ravinder?我现在正试图做同样的事情,但没有看到可行的解决方案。如果您知道,请在此处发表评论。 如何在android中使用qt-faststart?有人可以发布示例代码吗?【参考方案2】:

你有问题。 “moov”框是一种目录。如果不是所有的内容都在那里,你就不可能有一个完整的目录。哎哟!

如果您想坚持使用 MP4 并且您自己编写文件,您可以将文件写入所谓的分段 MP4 文件。一个分段的 MP4 文件包含多个独立的小视频片段——每个片段都有自己的目录。它可以让您在完整录制完成之前播放文件。

如果您不需要坚持使用 MP4,则可以选择将原始 h264 流写入服务器。那么你就没有那种目录。 VLC 可以播放原始 h264 流。

【讨论】:

嗨,sebsatian,我在录制视频时无法在 android 中获取行数据,你能告诉我如何实现这一点。 我知道 MP4,但不是特别了解 Android。也许您应该创建一个新问题。 另一种方法可能是只记录一两秒并在服务器上再次连接?!【参考方案3】:

使用 MP4Box 在文件开始时移动 MOOV atom,并在块中交错传输。

MP4Box test.mp4 test.mp4

【讨论】:

它对我不起作用。它返回:错误 - 指定了 2 个输入名称,请检查使用 MP4Box 版本 0.5.0-rev4065 不应该是MP4Box -add fixed.mp4 -isma sample.mp4之类的吗?见muzso.hu/2012/11/14/…【参考方案4】:

将此库添加到您的 gradle:compile 'net.ypresto.qtfaststartjava:qtfaststart:0.1.0' 然后

File input = new File(path + "/input.mp4"); // Your input file
File output = new File(path + "/output.mp4"); // Your output file
try
    if(!output.exists()) // if there is no output file we'll create one
        output.createNewFile();
    
catch (IOException e)
    Log.e("TAG", e.toString());


try
    QtFastStart.fastStart(input, output); // Adds moov to your input
                                          // Now your output file is ready to stream!
catch (QtFastStart.MalformedFileException m)
    Log.e("QT", m.toString());
catch (QtFastStart.UnsupportedFileException q)
    Log.e("QT", q.toString());
catch (IOException i)
    Log.e("QT", i.toString());

就是这样

【讨论】:

【参考方案5】:

可以使用 FFMpeg 将 moov atom 移动到视频文件的开头。

ffmpeg -i input_video_file.mp4 -vcodec copy -acodec copy -movflags faststart output_video_file.mp4

【讨论】:

这里是一个快速参考指南:gist.github.com/jaydenseric/220c785d6289bcfd7366 这里有一个错字,“+faststart”应该是“faststart”,正确的命令是“ffmpeg -i input_video_file.mp4 -vcodec copy -acodec copy -movflags faststart output_video_file.mp4” – Joey May 2018 年 3 月 7:44 @RoubenTchakhmakhtchian 尽管有 OP 的标题,但这并不是一种添加丢失的 moov 原子的技术,只是将现有的 moov 从文件的末尾移动到文件的开头(这实际上是实际的在问题中要求)。如果你根本没有moov,那你的问题就更大了。 谢谢@BobSammers! 非常适合我!【参考方案6】:

有一个工具untrunc 声称可以修复未完成(截断)的 mp4、m4v、mov、3gp 视频。我自己没有测试过,但可能值得一试。

【讨论】:

对于 Windows 使用:videohelp.com/software/recover-mp4-to-h264 这通常不适用于我的视频,但我使用Anthon Lockwood's fork 取得了成功:它包含一个“-s”开关以“逐步遍历未知序列” 测试了其他软件,没有修复我损坏的文件,但只有这个。祝贺它的开发者!还有@k3a:感谢您的提示。 甚至还有在线服务untrunc.it【参考方案7】:

mp4格式需要moov atom信息才能播放视频,要生成moov atom视频必须完成,mp4文件在录制时不能播放,因为你还没有所有信息创建 moov atom 部分。

您想要做的是某种实时流式传输(在录制时播放),因此您需要使用另一种格式。 HLS 流和 mpeg-dash 将视频以小块(2 秒到 10 秒)存储并发送给用户,这样用户一个接一个地播放许多完成的文件。

正如@Sebastian Annies 建议的那样,创建许多微小的 mp4 文件并连接是相同的方法:拥有微小的完成文件并作为列表播放,在这里您可以获得更多信息What exactly is Fragmented mp4(fMP4)? How is it different from normal mp4?

【讨论】:

【参考方案8】:

在我的情况下,ffmpeg 甚至不允许我使用以下方法重新创建容器:

ffmpeg -i video.mp4 -c copy out.mp4

失败并出现同样的corrupted STCO atom 错误。

我可以通过在 avidemux 中打开视频文件并重新导出视频而不进行编码来解决此问题。

那么 ffmpeg 就可以毫无问题地读取这个文件了。

【讨论】:

以上是关于如何在 mp4 视频文件中添加 MOOV 原子的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Media Foundation 生成“moov before mdat”MP4 视频文件

Windows系统中ckplayer视频边下边放,视频转码mp4及"last atom in file was not a moov atom"问题

在碎片MP4中运行的轨道是否必须以关键帧开始?

如何将flv视频格式转换为mp4视频格式

如何使基于Media Foundation的播放打开并快速查找moov结尾的MP4 HTTP文件?

06 织梦添加MP4视频上传