我遇到了一个问题。
我正在尝试从设备到服务器的实时音频流。
该设备通过套接字连接到服务器。我创建了一个 LocalServerSocket 并将 MediaRecorder.setOutputFile 设置为此本地套接字。
但是,当我尝试执行 MediaRecoder.start() 时,它会引发 IllegalStateException。如果输出文件是本地文件,它会成功通过。
我还交换了本地套接字的发送方和接收方,结果相同。
public class ChatClientV2 extends AsyncTask {
private boolean _mInChatMode=false, _mStopChat = false;
private Object syncObject= new Object();
private int _mPort;
private String _mServerAddress;
private MediaRecorder _mMediaRecorder;
private MediaPlayer _mMediaPlayer;
private LocalServerSocket _mLocalServer;
private LocalSocket _mLocalReceiver, _mLocalSender;
//private MediaPlayer _mMediaPlayer;
// private AudioRecord _mRecorder;
// private AudioTrack _mPlayer;
// private int _mBufferSize;
//private ChatPlayBack _mChatPlayBack;
private final String LOCAL_SOCKET_NAME = "chatRecord";
public ChatClientV2(String serverAddress, int serverPort, int sampleRate){
_mServerAddress=serverAddress;
_mPort=serverPort;
_mMediaRecorder = new MediaRecorder();
//_mChatPlayBack = new ChatPlayBack(sampleRate);
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,(Object)null);
}
public void startChat(){
if (_mInChatMode)
return;
synchronized (syncObject) {
_mStopChat=false;
_mInChatMode=true;
syncObject.notifyAll();
}
startRecording();
}
public void stopChat(){
if (!_mInChatMode)
return;
synchronized (syncObject){
_mInChatMode = false;
syncObject.notifyAll();
}
pauseRecording();
}
public void endChat(){
synchronized (syncObject){
_mStopChat = true;
syncObject.notifyAll();
}
}
@Override
protected Object doInBackground(Object[] objects) {
Socket _mSocket = new Socket();
try {
_mSocket.connect(new InetSocketAddress(_mServerAddress, _mPort));
// _mChatPlayBack.startPlayBack(_mSocket);
try {
_mLocalServer = new LocalServerSocket(LOCAL_SOCKET_NAME);
setUpRecorder();
_mLocalSender=_mLocalServer.accept();
} catch (IOException e) {
e.printStackTrace();
return null;
}
byte tempBuffer[] = new byte[1024];
while (!_mStopChat){
int retval= _mLocalSender.getInputStream().read(tempBuffer);
if (retval > 0 ){
_mSocket.getOutputStream().write(tempBuffer,0,retval);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void setUpRecorder(){
try
{
_mLocalReceiver = new LocalSocket(LocalSocket.SOCKET_STREAM);
_mLocalReceiver.connect(new LocalSocketAddress(LOCAL_SOCKET_NAME));
}
catch (IOException e)
{
e.printStackTrace();
}
Log.i("AudioRecord","------mRecorder configured--------");
}
private void startRecording(){
_mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
_mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
_mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
_mMediaRecorder.setOutputFile(_mLocalReceiver.getFileDescriptor());
try
{
_mMediaRecorder.prepare();
_mMediaRecorder.start();
Log.i("AudioRecord","------mRecorder.start()--------");
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private void pauseRecording(){
_mMediaRecorder.stop();
}
}
logcat在下面
W/b202.card28.g28: type=1400 audit(0.0:122215): avc: denied { read write } for path="socket:[10736829]" dev="sockfs" ino=10736829 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c6,c257,c512,c768 tclass=unix_stream_socket permissive=0
E/MediaRecorder: start 0 m_rotation
E/MediaRecorder: start failed: -38
W/System.err: java.lang.IllegalStateException
W/System.err: at android.media.MediaRecorder.native_start(Native Method)
W/System.err: at android.media.MediaRecorder.start(MediaRecorder.java:1143)
W/System.err: at in.b202.card28.Chat.ChatClientV2.startRecording(ChatClientV2.java:157)
W/System.err: at in.b202.card28.Chat.ChatClientV2.startChat(ChatClientV2.java:61)
W/System.err: at in.b202.card28.GamePlay.handleChat(GamePlay.java:862)
W/System.err: at in.b202.card28.GamePlay.access$400(GamePlay.java:65)
W/System.err: at in.b202.card28.GamePlay$6.onLongClick(GamePlay.java:849)
我也尝试过不同的格式和编解码器。对此的任何帮助将不胜感激。