使用本地服务器套接字转换音频

问题描述 投票:0回答:2

我正在尝试修复一个将视频和音频投射到网络上的现有项目。我需要创建本地套接字:

socketId = "my.application.media." + suffix + "-" + new 
Random().nextInt();
localServerSocket = new LocalServerSocket(socketId);

receiver = new LocalSocket();
receiver.connect(new LocalSocketAddress(socketId));
receiver.setReceiveBufferSize(SOCKET_BUFFER_SIZE);
receiver.setSendBufferSize(SOCKET_BUFFER_SIZE);

sender = localServerSocket.accept();
sender.setReceiveBufferSize(SOCKET_BUFFER_SIZE);
sender.setSendBufferSize(SOCKET_BUFFER_SIZE);

并创建媒体记录器:

mMediaRecorder = new MediaRecorder();

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setAudioEncodingBitRate((int) 7.95 * 1024);
mMediaRecorder.setAudioSamplingRate(8000);
mMediaRecorder.setAudioChannels(1);
mMediaRecorder.setOutputFile(sender.getFileDescriptor());

mMediaRecorder.prepare();

但是我在java.lang.IllegalStateException上打电话给start之后得到了mMediaRecorder。我错过了什么?当我不使用sender.getFileDescriptor()时,一切正常,所以可能是问题所在。我知道有很多库提供此功能,但我更喜欢修复此功能。投射唯一的视频工作正常,唯一的问题是音频。非常感谢您的帮助。执行方法的顺序:添加日志以检查方法和线程的顺序:

creating sockets: Socket opening thread
creating receiver: Socket opening thread
creating sender: Socket opening thread
setting audio source: Socket opening thread
setting properties: Socket opening thread
creating file descriptor: Socket opening thread
preparing media recorder: Socket opening thread
starting media recorder: Socket opening thread

我发现我也收到了错误:

2019-02-13 18:15:49.701 6176-13833/? E/StagefrightRecorder: Output file descriptor is invalid
2019-02-13 18:15:49.701 7851-9780/my.application E/MediaRecorder: start failed: -38
android audio android-mediaplayer android-mediarecorder
2个回答
0
投票

正如所述here这个错误发生在java.lang.IllegalStateException

在非法或不适当的时间调用了一个方法。

所以考虑到这一点,并考虑到如何使用套接字的this文章,你应该将你的套接字相关的人员放在AsyncTask(分离的线程)中并使用try catchAsyncTask Documentation Socket Documentation如果你想扩展你的知识。


0
投票

因为看起来你试图使用getFileDescriptor之前(或之后如果它关闭)sender有数据将其拉出来。尝试将代码中较早位置的数据提取到变量,而不是使用此变量。

另一种可能性是; MediaRecorder文件说

您必须指定表示实际文件的文件描述符

所以请确保sender.getFileDescriptor()返回的类型是mMediaRecorder.setAudioChannels可以获得的正确类型。

© www.soinside.com 2019 - 2024. All rights reserved.