Sim*_*mon 6 sockets video android
我正试图通过本地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 = new byte[1024];
while ((len = in.read(buffer)) >= 0) {
Log.i(LOG_TAG, "Writing "+len+" bytes");
fop.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
fop.close();
mLocalClientSocket.close();
} catch (Exception e2) {}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是任何媒体播放器都无法读取由此产生的文件.你认为这是因为编码问题吗?如果我理解的话,这段代码应该生成一个二进制文件?!
在此先感谢,欢呼.
好的,我找到了文件无法播放的原因。在 MP4 和 3GPP 文件中,有一个包含字节的标头:
ftyp3gp4 3gp43gp6 宽 mdat
以十六进制表示
0000001866747970336770340000030033677034336770360000000877696465000392D86D6461740000
“mdat”标记之前的 4 个字节表示位于文件末尾的另一个“moov”标记的位置。该位置通常在录制结束时设置,但由于 MediaRecorder 无法查找套接字,因此在我们的例子中它无法将这些字节设置为正确的值。
我现在的问题是找到一种方法使这样的文件可流式传输,因为它涉及在录制结束之前播放它。
| 归档时间: |
|
| 查看次数: |
7380 次 |
| 最近记录: |