我正在处理Android上的设备到服务器流式传输,我能够将数据以字节形式发送到服务器,但当我在服务器上播放录制的文件时,VLC会提示找不到MOOV原子。经过多次尝试,我发现mp4文件的MOOV原子在最后生成。但我必须在录制的同时在服务器上播放该文件。我查看了SPYDROID和SIPDROID的源代码,但它们都无法正常工作。我尝试使用FFMPEG在服务器端添加moov
原子,但没有成功。请问有人知道如何做到这一点吗?
我正在处理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
input_video_file.mp4
并复制粘贴了确切的命令。然而,ffmpeg仍然产生以下错误:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55601375c0c0]未找到moov原子
和input_video_file.mp4:处理输入时发现无效数据。
- TJM运行qt_faststart将moov原子移到流的开头。
qt-faststart in.mp4 out.mp4
encountered non-QT top-level atom (is this a QuickTime file?) [...]
- silverdrMP4Box test.mp4 test.mp4
MP4Box -add fixed.mp4 -isma sample.mp4
这样吗?请参考 http://muzso.hu/2012/11/14/tools-to-fix-mp4-videos-so-players-can-start-playback-instantly-without-downloading-the-w - Gwyneth Llewelyn在你的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());
}
这就是全部