gpt4 book ai didi

java - Android (Java) 中 MediaRecorder 的 LocalSocket(Unix 域)客户端-服务器数据流问题

转载 作者:太空狗 更新时间:2023-10-29 16:39:10 25 4
gpt4 key购买 nike

我没有得到的是 Unix 域套接字之间的数据流。

我理解的Unix Domain Socket数据流是

LocalSocket 客户端.connect() --> LocalServerSocket 服务器.accept()

客户端向服务器发送数据,直截了当我明白了。

但是,对于从 Android 的 MediaRecorder 流式传输视频/音频,经过大量研究,我看到每个使用 LocalSocket 而不是 MediaRecorder 文件的示例原则上如下:

https://static.foxdogstudios.com/static/presentations/keeping-it-real-time.html#/9

LocalServerSocket server = new LocalServerSocket("some name");

receiver = new LocalSocket();
receiver.connect(server.getLocalSocketAddress());

LocalSocket sender = server.accept();//LocalSocket not LocalServerSocket as in Source link

// ...

// Give the MediaRecorder our fake file
recorder.setOutputFile(sender.getFileDescriptor());

这段代码看起来像:

MediaRecorder --> LocalSocket 发送方 -->

LocalServerSocket server .accept() --> LocalSocket receiver .connect()

这是怎么回事??

显然,套接字数据以相反的方向流动,因此,我不明白为什么这段代码会按预期工作。

能否请您指教。谢谢。

最佳答案

看来,基本上,我的想法是正确的。至少我看到的示例,发送者-接收者结构有问题。

这是我制作的更简单的模型:

package com.example.app;

import android.app.Activity;
import android.media.MediaRecorder;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.Bundle;

import java.io.IOException;

public class MainActivity extends Activity
{
private final String SOCKET_ADDRESS = "socket1";
private MediaRecorder mRecorder = new MediaRecorder();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

class IOThread extends Thread
{
@Override
public void run()
{
System.out.println("--------IO Thread------ ");
LocalSocket receiver;
LocalServerSocket server;

try
{
server = new LocalServerSocket(SOCKET_ADDRESS);

localServerCreated();
receiver = server.accept();

System.out.println("---------server.accept();------------- ");

int ret = 0;
while ((ret = receiver.getInputStream().read()) != -1)
{
System.out.println( "ret =" + ret);
}

System.out.println("ret =" + ret);

}
catch (IOException e)
{
}

}
}
IOThread io1 = new IOThread();
io1.start();


}

private void localServerCreated()
{
LocalSocket sender;
try
{
sender = new LocalSocket();
sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));

mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setOutputFile(sender.getFileDescriptor());

}
catch (IOException e)
{
e.printStackTrace();
}
System.out.println("------mRecorder configured--------");
try
{
mRecorder.prepare();
mRecorder.start();
System.out.println("------mRecorder.start()--------");
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}

}


}

关于java - Android (Java) 中 MediaRecorder 的 LocalSocket(Unix 域)客户端-服务器数据流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072763/

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