Живой аудио поток с использованием FFMPEG

13

Я пытаюсь передавать потоковое аудио с использованием ffmpegвнешнего USB-микрофона. Я следовал этому почти учебнику

Мне пришлось адаптировать некоторые шаги, но, наконец, я получил поток моего ноутбука с помощью этой команды:

ffmpeg -f oss -i /dev/dsp1 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://192.168.28.116:1234

Процессор почти на 100%, у меня плохой звук в течение двух секунд и после ничего ... Я вижу в Wireshark, что плата непрерывно посылает кадры.

У кого-нибудь есть идеи по снижению загрузки процессора?

hotips
источник
Возможно, вы захотите посмотреть на разгон и другое разделение памяти. Если у вас есть выбор кодека, вы можете добиться некоторого улучшения путем переключения. Вы также можете исследовать сжатие потока - хотя это может быть нулевой выигрыш - все, что вы получите во время передачи, может быть потеряно при сжатии.
Стив Робиллард
Вы пытались сначала записать в локальный файл? Я бы попробовал пошагово: 1) запись в реальном времени в волновой файл, 2) запись в реальном времени в mp3-файл 3) потоковое вещание по сети
pixelistik
не в данный момент. кажется сложным делать все эти шаги вручную вместо полностью автоматического ffmpeg ;-)
hotips
Что ты записываешь?
Алекс Чемберлен
1
Я пытаюсь сделать Ethernet Babyphone
hotips

Ответы:

7

Чтобы ответить на ваш конкретный вопрос, вы можете уменьшить загрузку процессора, добавив arecord в ffmpeg:

arecord -f cd -D plughw:1,0 | ffmpeg -i - -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234

Вам нужно будет заменить plughw: 1,0 вашей конкретной звуковой картой. Смотрите arecord -l для информации. На моем Rasp Pi он вырос с ~ 95% до ~ 35%.

kumar303
источник
6

ALSA вход

Одна альтернатива состоит в том, чтобы пройти через ALSA. Команда, аналогичная приведенной выше, будет

ffmpeg -ac 1 -f alsa -i hw:0,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://localhost:1234

Я не уверен, как это повлияет на использование процессора.

Алекс Чемберлен
источник
Я попытался: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 Но через несколько секунд ffmpeg вылетает: [alsa @ 0x7a1510] ALSA буфер xrun. Есть еще идеи?
hotips
Я тестировал ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234, но звук очень плохой ... задержка составляет около 6 секунд. Есть идеи, чтобы найти лучшее решение?
hotips
1
@ si2w Я думаю, 32k для mp3 - это немного шутка. Либо до этого, либо попробуйте другой кодек. Может быть, один из серии G2xx, предназначенный для телефонов
Алекс Чемберлен
3

Это работает и уменьшает использование процессора:

ffmpeg -f alsa -i default:CARD=U0x46d0x819 -acodec mp2 -ac 1 -re -f rtp rtp://234.5.5.5:1234 2> /tmp/mylog.log &

Обязательно замените значение по умолчанию: CARD = U0x46d0x819 на ваш идентификатор микрофона (полученный из arecord -l), или вы можете указать -i hw:0,0(или любое другое устройство).

У меня была похожая проблема - кодирование mp3 занимало 90% + мощности процессора и просто не могло идти в ногу со звуком - поэтому я изменил его на кодировку mp2. При этом использовалось около 15-18% процессорного времени (измеренное vi top) и плавно передавалось в VLC в моей локальной сети. Это сделало бы идеальный радионяня или что угодно. Существует только секунда или около того задержка, которая является буферизацией на конце VLC.

Примечание . IP-адрес является многоадресным ([224-239] .xyz). Вам не нужно нацеливать его на определенное сетевое устройство в вашей локальной сети, и ваш широкополосный маршрутизатор будет поддерживать локальный трафик (по умолчанию).

Тим
источник
2

Вы можете значительно снизить нагрузку на процессор, уменьшив частоту дискретизации звука на устройстве ввода ( -ar 8000 до -f alsa ) и установив битрейт аудио для кодека на 128k ( -b:a 128k). Также, по иронии судьбы, уменьшение количества каналов ( -ac 1), похоже, увеличивает нагрузку на процессор, поэтому я обнаружил, что эта команда работает при довольно низкой загрузке процессора:

ffmpeg -ar 8000 -f alsa -i hw:0 -acodec mp2 -b:a 128k -f rtp rtp://other:4444

Хотя нужно помнить, что это также зависит от возможностей аппаратного обеспечения захвата, которое вы пытаетесь использовать, и версий ffmpeg / avconv.

Пирз
источник