我试图通过本地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 …Run Code Online (Sandbox Code Playgroud) 我正试图通过本地Socket从Android的MediaRecorder发送h264/AAC视频.目标是通过RTMP或RTSP将视频发送到WOWZA服务器,但它给我带来了很多麻烦,而现在我只是试图将数据写入LocalServerSocket中的文件.
这是一些代码.对不起,它不是很干净,但我花了好几个小时测试很多东西,现在我的项目很乱.
在Camera活动中,输出文件设置:
LocalSocket outSocket = new LocalSocket();
try {
outSocket.connect(new LocalSocketAddress(LOCAL_SOCKET));
} catch (Exception e) {
Log.i(LOG_TAG, "Error connecting socket: "+e);
}
mMediaRecorder.setOutputFile(outSocket.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)
LocalServerSocket实现:
try {
mLocalServerSocket = new LocalServerSocket(mName);
} catch (Exception e) {
Log.e(LOG_TAG, "Error creating server socket: "+e);
return;
}
while (true) {
File out = null;
FileOutputStream fop = null;
try {
mLocalClientSocket = mLocalServerSocket.accept();
InputStream in = mLocalClientSocket.getInputStream();
out = new File(mContext.getExternalFilesDir(null), "testfile.mp4");
fop = new FileOutputStream(out);
int len = 0;
byte[] buffer = …Run Code Online (Sandbox Code Playgroud)