gpt4 book ai didi

android - 通过 LocalSocket 从 MediaRecorder 流式传输视频

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:12:43 57 4
gpt4 key购买 nike

我正在尝试通过本地套接字从 Android 的 MediaRecorder 发送 h264/AAC 视频。目标是通过 RTMP 或 RTSP 将视频发送到 WOWZA 服务器,但这给我带来了很多麻烦,现在我只是试图将数据写入 LocalServerSocket 的文件。

这是一些代码。抱歉,它不是很干净,但我花了几个小时测试很多东西,我的项目现在一团糟。

在相机 Activity 中,输出文件设置:

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) {}
}
}

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

提前致谢,干杯。

最佳答案

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

ftyp3gp4 3gp43gp6 wide mdat

十六进制

0000001866747970336770340000030033677034336770360000000877696465000392D86D6461740000

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

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

关于android - 通过 LocalSocket 从 MediaRecorder 流式传输视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720796/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com