I am working on live device to server streaming in android. I am able to send data in bytes on server but when I play that file during recording on server VLC say that MOOV atom not found. After a lot of workaround I found that MOOV atom of a mp4 file generates in the end. But I have to play that file on server while recording means live. I go through the source code of SPYDROID and SIPDROID but non of them is working. I tried to add moov
atom on serverside using FFMPEG but didn't get any success. Anyone has an idea on how can I achieve this?
8 回答
有一个工具untrunc声称可以修复未完成(截断)的 mp4、m4v、mov、3gp 视频。我自己没有测试过,但可能值得一试。
你有问题。“moov”框是一种目录。如果不是所有的内容都在那里,你就不可能有一个完整的目录。哎哟!
如果您想坚持使用 MP4 并且您自己编写文件,您可以将文件写入所谓的分段 MP4 文件。一个分段的 MP4 文件包含多个独立的小视频片段——每个片段都有自己的目录。它可以让您在完整录制完成之前播放文件。
如果您不需要坚持使用 MP4,则可以选择将原始 h264 流写入服务器。那么你就没有那种目录。VLC 可以播放原始 h264 流。
可以使用 FFMpeg 将 moov atom 移动到视频文件的开头。
ffmpeg -i input_video_file.mp4 -vcodec copy -acodec copy -movflags faststart output_video_file.mp4
运行 qt_faststart 将 moov atom 移动到流的开头。
qt-faststart in.mp4 out.mp4
使用 MP4Box 在文件开始时移动 MOOV 原子并以块的形式进行交错流。
MP4Box test.mp4 test.mp4
mp4 格式需要 moov atom 信息来播放视频,并且要生成 moov atom 视频必须完成,您无法在录制时播放 mp4 文件,因为您仍然没有创建文件的所有信息moov 原子部分。
您想要做的是某种实时流式传输(在录制时播放),因此您需要使用另一种格式。HLS 流和 mpeg-dash 将视频存储在小块(2 秒到 10 秒)中并发送给用户,这样用户一个接一个地播放许多完成的文件。
正如@Sebastian Annies 建议的那样,创建许多微小的 mp4 文件并连接是相同的方法:拥有微小的完成文件并作为列表播放,在这里您可以获得更多信息Fragmented mp4(fMP4) 到底是什么?它与普通的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());
}
这就是全部