Я застрял с проблемой.
Я пытаюсь выполнить потоковую передачу звука с устройства на сервер.
Устройство подключено к серверу через сокет. Я создал 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)
Я также пробовал с разными форматами и кодеками. Любая помощь в этом будет оценена.