Ale*_*yan 12 video android 3gp video-streaming android-mediarecorder
我试图通过本地unix socket从android摄像头流式传输视频,并将文件从流写入sdcard.一切正常,除了文件不能播放任何播放器.这是因为Android没有填补文件中的一些空白,因为socket不可寻找.据我所知,我需要在视频流结束后进行一些修改.我在这里,这里和这里读过几篇文章,但没有一篇能帮到我.我正在使用十六进制编辑器来学习如何手动完成它,所以之后在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
Run Code Online (Sandbox Code Playgroud)
然后我用以下命令找到mdat和moov原子的起始位置:
grep -aobE "ftyp|mdat|moov" sample_not_playable.3gp
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
4:ftyp
28:mdat
1414676:moov
Run Code Online (Sandbox Code Playgroud)
然后做 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
Run Code Online (Sandbox Code Playgroud)
当我尝试用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!
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
av5*_*501 13
您需要了解的是mp4不是实时流式处理格式.因此,无论如何你都无法破解它以使其可以流动.标题[moov atom]写在最后.Android创建一个内存表,其中包含帧大小和其他参数,然后在记录结束时在文件的开头写入,因此需要文件句柄的可搜索性.[哪个插座不是]
如果您正在将加密内容写入磁盘,并且您希望这样做以便没有人可以播放该文件,则您不必加密整个文件.您只需加密标头,整个文件无法播放.
如果您迫切需要完整的文件编码,因为您不相信我以前的para,那么请使用像ffmpeg这样的编码.修改它会自动为您提供加密输出并再次将其保存到硬盘 - 再次删除套接字部分.
你无法在android中实时播放mp4文件.我见过很多人徒劳无功,如果你理解视频/格式,你就无法做到.mp4不适用于直播.除非你事先知道你的帧大小[你没有]和编码的确切长度[你很可能不知道; t]你不能预先创建标题.
PS.mp4和3gp是表兄弟,所以同样适用.
许多人将实时流与http pd和伪流混淆.实时流式传输意味着我没有整个文件,它正在被创建并且还在运行中进行流式传输.http pd和伪流式传输使用完全可用的文件.
编辑:
如果您的目标是在存储到SD卡之前加密录制的文件,则需要编码器支持.这意味着在那里获得自己的编码器.拿ffmpeg,交叉编译成android.为您的应用程序编写一个小型JNI接口.首先进行此操作而不加密.完成后,ffmpeg会写入流,然后添加加密模块.解码时也一样.Y3ng创作.这是最干净的方法.
编辑2:请参阅spydroid以获得一些功能.那里有类似的.
编辑3:为了提高答案的质量,我正在解释其他答案给出的不完美的解决方法:
人们仍然可以通过在生成mp4时解析mp4并通过套接字单独发送基本流来流式传输AV.您将面临的唯一问题是您将无法获得完美的AV同步,因为您不知道确切的AV样本时间戳.只有android知道它,并在最后写入mp4标题.所以对你没有好处.您必须对视频帧的完美采样率做出假设,并且您的音频必须假定为20ms数据包.在其他音频情况下,您将开始看到长跑的漂移[特别是在您开始有高动作场景的地方].这是因为生成的每个音频数据包都不对应于固定的持续时间[除了amr和其他语音编解码器]
| 归档时间: |
|
| 查看次数: |
7661 次 |
| 最近记录: |