我正在开发实时设备到 Android 中的服务器流媒体。我能够在服务器上以字节为单位发送数据,但是当我在服务器VLC上录制期间播放该文件时,说找不到MOOV原子。经过大量的解决方法后,我发现最终会生成 mp4 文件的 MOOV 原子。但我必须在服务器上播放该文件,同时录制意味着现场直播。我浏览了 SPYDROID 和 SIPDROID 的源代码,但它们都不起作用。我尝试使用
FFMPEG在服务器端添加
moov
原子,但没有取得任何成功。有人知道我该如何实现这一目标吗?
有一个工具 untrunc 声称可以修复未完成(截断)的 mp4、m4v、mov、3gp 视频。我自己没有测试过,但可能值得一试。
你遇到了问题。 “moov”框是一种目录。如果不是所有内容都在那里,您就无法拥有完整的目录。哎呀!
如果您想坚持使用 MP4 并且您自己编写文件,您可以将该文件编写为所谓的碎片 MP4 文件。碎片 MP4 文件包含多个独立的视频小片段 - 每个片段都有自己的目录。它将使您能够在完整录制完成之前播放文件。
如果您不需要坚持使用 MP4,则可以选择将原始 h264 流写入服务器。那么你就没有这样的目录。 VLC 可以播放原始 h264 流。
可以使用 FFMpeg 将 moov 原子移动到视频文件的开头。
ffmpeg -i input_video_file.mp4 -vcodec copy -acodec copy -movflags faststart output_video_file.mp4
运行 qt_faststart 将 moov 原子移动到流的开头。
qt-faststart in.mp4 out.mp4
mp4格式需要moovatom信息来播放视频,并且要生成moovatom视频必须完成,您无法在录制时播放mp4文件,因为您仍然没有创建的所有信息moov 原子部分。
您想要做的是某种实时流媒体(在录制时播放),因此您需要使用另一种格式。 HLS 流和 mpeg-dash 将视频存储为小块(2 秒到 10 秒)并发送给用户,这样用户就可以依次播放许多完成的文件。
正如@Sebastian Annies建议的,创建许多微小的mp4文件并连接是相同的方法:拥有微小的成品文件并作为列表播放,在这里您可以获得更多信息碎片mp4(fMP4)到底是什么?和普通mp4有什么区别?
使用 MP4Box 在文件开始处移动 MOOV 原子并交织到块中的流中。
MP4Box test.mp4 test.mp4
将此库添加到您的 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());
}
就这些了