Кастинг аудио с сокетом локального сервера - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь исправить существующий проект, который транслирует видео и аудио в Интернет.Мне нужно создать локальный сокет:

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Как вам кажется, вы пытаетесь использовать getFileDescriptor до (или после закрытия) sender, чтобы получить данные.Попробуйте извлечь данные из более раннего места в коде в переменную, а затем использовать эту переменную.

Другая возможность может быть; MediaRecorder документация гласит:

Вы должны указать дескриптор файла, представляющий фактический файл

, поэтому убедитесь, что тип, возвращаемый sender.getFileDescriptor(), равенправильный тип, который mMediaRecorder.setAudioChannels может получить.

0 голосов
/ 12 февраля 2019

Как указано здесь эта ошибка java.lang.IllegalStateException возникает, когда

метод был вызван в недопустимое или неподходящее время.

Такпомня об этом и этой статье о том, как использовать сокеты, вы должны поместить персонал, связанный с сокетами, в AsyncTask (отдельный поток) и использовать try catch.
AsyncTaskДокументация и Документация сокетов , если вы хотите расширить свои знания.

...