我试图通过本地Socket从Android的MediaRecorder发送h264/AAC视频。目标是通过RTMP或RTSP将视频发送到WOWZA服务器,但它给我带来了很多麻烦,现在我只是试图从LocalServerSocket将数据写入文件。从MediaRecorder通过LocalSocket流式传输视频
这是一些代码。对不起,它不是很干净,但我花了几个小时来测试很多事情,现在我的项目很混乱。
在摄像头活动,将输出文件设置:
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());
的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) {}
}
}
的问题是,由此产生的文件是不会被任何媒体播放器可读。你认为这是由于编码问题?如果我理解得很好,这段代码应该生成一个二进制文件?!
在此先感谢,欢呼声。
如果您没有得到错误,它可能是由编码/文件名问题引起的。你设置了什么[OutputFormat](http://developer.android.com/reference/android/media/MediaRecorder.OutputFormat.html)?也许将其重命名为'.3gp'或者帮助 - 请参阅[这里](http://stackoverflow.com/questions/9110711/android-mediarecorder-getting-3gp-instead-of-mpeg4) – zapl
输出格式是MPEG_4,所以我想应该用.mp4扩展名来确定。此外,如果我直接写入mMediaRecorder.setOutputFile()中的.mp4文件,它可以很好地工作。 – Simon
是否检查过像[mediainfo](http://mediainfo.sourceforge.net/en)这样的内容是否可以读取已创建视频的属性?你也可以尝试直接生成的文件的二进制比较(至少是头文件),并通过本地套接字发送文件以检查生成的文件是否正确。 – zapl