如何在mp4视频文件中添加MOOV原子[已关闭]

问题描述 投票:0回答:7

我正在开发实时设备到 Android 中的服务器流媒体。我能够在服务器上以字节为单位发送数据,但是当我在服务器VLC上录制期间播放该文件时,说找不到MOOV原子。经过大量的解决方法后,我发现最终会生成 mp4 文件的 MOOV 原子。但我必须在服务器上播放该文件,同时录制意味着现场直播。我浏览了 SPYDROIDSIPDROID 的源代码,但它们都不起作用。我尝试使用

FFMPEG
在服务器端添加 moov 原子,但没有取得任何成功。有人知道我该如何实现这一目标吗?

java android android-layout mp4 live-streaming
7个回答
36
投票

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


24
投票

你遇到了问题。 “moov”框是一种目录。如果不是所有内容都在那里,您就无法拥有完整的目录。哎呀!

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

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


14
投票

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

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

4
投票

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

qt-faststart in.mp4 out.mp4

2
投票

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

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

正如@Sebastian Annies建议的,创建许多微小的mp4文件并连接是相同的方法:拥有微小的成品文件并作为列表播放,在这里您可以获得更多信息碎片mp4(fMP4)到底是什么?和普通mp4有什么区别?


1
投票

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

MP4Box test.mp4 test.mp4

-6
投票

将此库添加到您的 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());
}

就这些了

© www.soinside.com 2019 - 2024. All rights reserved.