从MediaRecorder通过LocalSocket流式传输视频

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)

问题是任何媒体播放器都无法读取由此产生的文件.你认为这是因为编码问题吗?如果我理解的话,这段代码应该生成一个二进制文件?!

在此先感谢,欢呼.

Sim*_*mon 2

好的,我找到了文件无法播放的原因。在 MP4 和 3GPP 文件中,有一个包含字节的标头:

ftyp3gp4 3gp43gp6 宽 mdat

以十六进制表示

0000001866747970336770340000030033677034336770360000000877696465000392D86D6461740000

“mdat”标记之前的 4 个字节表示位于文件末尾的另一个“moov”标记的位置。该位置通常在录制结束时设置,但由于 MediaRecorder 无法查找套接字,因此在我们的例子中它无法将这些字节设置为正确的值。

我现在的问题是找到一种方法使这样的文件可流式传输,因为它涉及在录制结束之前播放它。

  • 您是否找到了使其可流式传输的解决方案? (3认同)
  • 大家好,检查一下流媒体的良好实现:https://github.com/fyhertz/libstreaming (3认同)