Потоковое воспроизведение необработанного звука с помощью FFMPEG - PullRequest
0 голосов
/ 16 июня 2020

Я использую библиотеку ffmpeg для декодирования / кодирования звука в JAVA, используя объекты Process. Цель состоит в том, чтобы получить необработанные данные, декодированные с помощью ffmpeg в моем коде JAVA, а затем отправить их обратно в ffmpeg для генерации потока или создания файла.

Как JAVA звуки разрешают только звук в формате wav datas, я сделал первую попытку с этой командной строкой:

ffmpeg -i http://199.180.75.118:80 -acodec pcm_s16le -ar 44100 -ac 2 "/home/dr_click/montest.wav"

Работает. Но моя цель - получать кадры на лету, а не файл. Я думал об использовании канала, но похоже, что он будет работать только с Linux, а не с Windows (и не знаю для MacOS). Итак, я бы предпочел локально транслировать wav-файл и ловить его с помощью JAVA в AudioInputStream.

Я написал эту команду:

ffmpeg -re -i http://199.180.75.118:80 -acodec pcm_s16le -ar 44100 -ac 2 -f rtp rtp://127.0.0.1:1234

Он должен работать на стороне сервера. Но когда я ввожу следующую командную строку на стороне сервера:

ffplay rtp://127.0.0.1:1234

Это вообще не работает. Я получил эту ошибку:

  • [rtp @ 0x7f29c8000b80] Невозможно получить тип полезной нагрузки RTP 97 без файла SDP, описывающего его

Если я попробую пару:

ffmpeg -i http://199.180.75.118:80 -acodec pcm_s16le -ar 44100 -ac 2 -f rtp -sdp_file /home/dr_click/audio.sdp rtp://127.0.1.1:1234

и

ffplay /home/dr_click/audio.sdp

Я получил следующую ошибку:

  • [rtp @ 0x7f7d00008040] Протокол 'rtp' отсутствует в файле белого списка, crypto '! if

И если я наконец попробую:

fmpeg -protocol_whitelist file,http,rtp,tcp -i http://199.180.75.118:80 -acodec pcm_s16le -ar 44100 -ac 2 -f rtp -sdp_file /home/dr_click/audio.sdp rtp://127.0.1.1:1234

, я все равно получаю ту же ошибку.

Какой момент мне не хватает для локальной потоковой передачи некоторых необработанных данных и поймать их обратно в AudioInputStream?

Спасибо за все ваши ответы.

1 Ответ

0 голосов
/ 30 июня 2020

Наконец-то я нашел объяснение. Потоковая передача RTP с полезной нагрузкой 10 или 11 является прямым порядком байтов. Таким образом, невозможно выполнить потоковую передачу с прямым порядком байтов c. Правильный способ потоковой передачи - изменить код c, и командная строка станет:

ffmpeg -re -i /home/dr_click/live.wav -acodec pcm_s16be -ar 44100 -ac 2 -payload_type 10 -f rtp rtp://127.0.0.1:1234

Спасибо тем, кто прочитал мой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...