我正在尝试通过本地 unix 套接字从 android 相机流式传输视频并将文件从流写入 sdcard。一切正常,除了文件不能用任何播放器播放。这是因为 Android 没有填补文件中的一些空白,因为套接字是不可搜索的。据我了解,我需要在视频流结束后进行一些修改。我在这里、这里和这里阅读了几篇文章,但没有一篇对我有帮助。我正在使用十六进制编辑器来学习如何手动进行操作,因此之后在 Android 代码中执行相同操作将是微不足道的。
这是从流中保存的示例文件:https ://dl.dropbox.com/u/17510473/sample_not_playable.3gp
任何人都可以修复以使其可玩并告诉他是如何做到的吗?
编辑:我删除 3gp 文件的标题并编写新的如下:
00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 34 33 67 70 36 00 00 00 00
然后我使用以下命令找到 mdat 和 moov 原子的起始位置:
grep -aobE "ftyp|mdat|moov" sample_not_playable.3gp
它给了我以下输出:
4:ftyp
28:mdat
1414676:moov
然后制作1414676 - 28 = 1,414,648 = 0x1595F8
然后我将 0x1595F8 写为 25-28 个字节,就在 mdat 原子之前。所以我的标题现在看起来像这样:
00 00 00 18 66 74 79 70 33 67 70 34 00 00 03 00 33 67 70 34 33 67 70 36 00 15 95 F8
当我尝试用 mplayer 播放它时,我得到一些损坏的视频和音频输出。以下是 mplayer 输出的部分内容:
[amrwb @ 0x7f72ad652380]Frame too small (33 bytes). Truncated file?
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Frame too small (33 bytes). Truncated file?
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
[amrwb @ 0x7f72ad652380]Encountered a bad or corrupted frame
A: 11.0 V: 1.4 A-V: 9.650 ct: 0.023 0/ 0 10% 1% 1.6% 0 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f72adeafc40]stream 1, offset 0x15e62b: partial file
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
A: 11.1 V: 1.5 A-V: 9.558 ct: 0.027 0/ 0 9% 1% 1.4% 0 0
[h263 @ 0x7f72ad652380]Bad picture start code
[h263 @ 0x7f72ad652380]header damaged
Error while decoding frame!
我做错了什么?