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

时间:2012-07-17 13:42:43

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

我正在使用android中的实时设备到服务器流。我可以在服务器上以字节为单位发送数据,但是当我在服务器 VLC 上录制期间播放该文件时,表示未找到 MOOV 原子。经过大量的解决方法后,我发现mp4文件的 MOOV 原子最终会生成。但我必须在服务器上播放该文件,而录制意味着直播。我浏览了 SPYDROID SIPDROID 的源代码,但是没有它们正在运行。我尝试使用 FFMPEG 在服务器端添加move atom,但没有取得任何成功。任何人都知道如何实现这一目标。 Thanx提前。

8 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

你遇到了问题。 'moov'框是一种目录。如果不是所有内容都存在,则无法获得完整的目录。哎哟!

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

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

答案 2 :(得分:3)

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

qt-faststart in.mp4 out.mp4

答案 3 :(得分:3)

使用MP4Box在文件开头移动MOOV原子并交错到块中的流。

MP4Box test.mp4 test.mp4

答案 4 :(得分:1)

mp4格式需要moov原子信息来播放视频,并且要生成moov原子,视频必须完成,因此在录制时无法播放mp4文件,因为您仍然没有所有信息创建moov原子部分。

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

就像@塞巴斯蒂安·安妮(Sebastian Annies)所建议的,创建许多小的mp4文件并进行连接是相同的方法:拥有小的完成文件并作为列表播放,在这里您可以获得更多信息What exactly is Fragmented mp4(fMP4)? How is it different from normal mp4?

答案 5 :(得分:0)

将这个lib添加到您的gradle中:编译&net; .net.streststartjava: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());
}

这就是

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

就我而言,ffmpeg甚至不让我使用以下方法重新创建容器:

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

它失败,并出现相同的corrupted STCO atom错误。

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

avidemux

然后ffmpeg可以毫无问题地读取此文件。