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

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

【问题讨论】:

  • 我可以使用 ffmpeg 解决我在 Plex 上播放电视剧的问题吗?日志表明:
  • 为了更清楚地说明,我在树莓派 4 上运行我的 plex 和 nas 服务器。我正在使用“MacX DVD Ripper Pro”来翻录视频。我搬到了最新版本的 plex (1.21.1.3830),它应该允许新的扫描仪

标签: java android android-layout mp4 live-streaming


【解决方案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 视频。我自己没有测试过,但可能值得一试。

    【讨论】:

    • 这通常不适用于我的视频,但我使用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 就可以毫无问题地读取这个文件了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 2013-11-17
        • 1970-01-01
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多