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