【发布时间】:2023-04-11 12:48:01
【问题描述】:
我正在尝试制作一个使用MediaRecorder 录制音频的示例,该示例录制的数据通过Android 上的UDP 套接字传递(>=4.0)。
阅读文章: Broadcasting video with Android - without writing to local files, 我雇用了ParcelFileDescriptor.fromDatagramSocket
这是我目前正在处理的简化伪代码:
//private DatagramSocket ds;
//private MediaRecorder mRecorder;
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromDatagramSocket(ds);
mRecorder = new MediaRecorder();
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setOutputFile(pfd.getFileDescriptor());
mRecorder.prepare();
mRecorder.start();
这里只是一个简单的DatagramSocket(UDP) Listener线程循环观察DatagramSocket ds
//...
private DatagramSocket ds;
private int localPort = 39000;
private MediaRecorder mRecorder;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
ds = new DatagramSocket(localPort);
}
catch (SocketException e)
{
System.out.println(e);
}
class IOThread extends Thread
{
@Override
public void run()
{
byte []buf = new byte[1024];
DatagramPacket packet= new DatagramPacket(buf, buf.length);
while (true)
{
try
{
ds.receive(packet);
SocketAddress sockAddress = packet.getSocketAddress();
int len = packet.getLength();
String msg = new String(buf, 0, len);
System.out.println(msg + ":" + len + "byte receive by "+ sockAddress.toString());
}
catch (IOException e)
{
System.out.println(e);
}
}
}
}
IOThread io1 = new IOThread();
io1.start();
//..........
原则上,我希望MediaRecorder 记录的缓冲区通过 UDP FileDescriptor 传递,并且我可以通过某种方式管理套接字,但到目前为止,我没有观察到任何事情发生。
我确认 UDP 侦听器单元与其他 UDP 输入一起工作正常,MediaRecorder 单元应该没问题,因为它适用于 localFiles 而不是 UDP 套接字 FileDescriptor。
有什么建议吗?
提前致谢!
【问题讨论】:
标签: java android sockets udp file-descriptor