44

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?

4

8 回答 8

23

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

于 2020-02-26T21:44:13.683 回答
20

你有问题。“moov”框是一种目录。如果不是所有的内容都在那里,你就不可能有一个完整的目录。哎哟!

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

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

于 2012-07-18T22:57:43.107 回答
14

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

ffmpeg -i input_video_file.mp4 -vcodec copy -acodec copy -movflags faststart output_video_file.mp4
于 2017-05-31T10:22:31.150 回答
6

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

qt-faststart in.mp4 out.mp4
于 2012-07-18T08:57:23.130 回答
2

使用 MP4Box 在文件开始时移动 MOOV 原子并以块的形式进行交错流。

MP4Box test.mp4 test.mp4
于 2012-12-10T14:17:28.653 回答
1

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

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

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

于 2020-09-25T13:41:26.960 回答
-1

在我的情况下,ffmpeg 甚至不允许我使用以下方法重新创建容器:

ffmpeg -i video.mp4 -c copy out.mp4

它因同样的corrupted STCO atom错误而失败。

我可以通过在avidemux中打开视频文件并在不编码的情况下重新导出视频来解决此问题。

AVIDUX

然后ffmpeg可以毫无问题地读取这个文件。

于 2020-12-04T19:57:06.843 回答
-7

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

这就是全部

于 2016-08-23T01:47:10.787 回答