Transmissão de áudio ao vivo usando FFMPEG

13

Tento transmitir áudio ao vivo usando ffmpegum microfone USB externo. Eu segui este quase tutorial

Tive que adaptar algumas etapas, mas finalmente consegui receber o stream do meu laptop usando este comando:

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

A CPU está perto de 100%, tenho um som ruim durante dois segundos e depois de nada ... Vejo no Wireshark que a placa está enviando quadros continuamente.

Alguém tem idéias para diminuir o uso da CPU?

hotips
fonte
Você pode procurar em overclocking e uma divisão de memória diferente. Se você tiver a opção de codec, poderá conseguir algumas melhorias alternando. Você também pode investigar a compactação do fluxo - embora isso possa ser um ganho de zero - qualquer coisa que você ganhar no tempo de transferência pode ser perdida na compactação.
9788 Steve Robillard
Você tentou gravar em um arquivo local primeiro? Eu tentaria ir passo a passo: 1) gravação em tempo real para um arquivo de onda, 2) gravação em tempo real para um arquivo mp3 3) material de streaming através da rede
pixelistik
não no momento. parece ser complicado para fazer todos os thoses etapas manualmente em vez de ffmpeg automática cheia ;-)
hotips
O que você está gravando?
Alex Chamberlain
1
Eu estou tentando fazer uma babyphone ethernet
hotips

Respostas:

7

Para responder sua pergunta específica, você pode reduzir a CPU canalizando um registro no 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

Você precisará substituir plughw: 1,0 por sua placa de som específica. Veja arecord -l para informações. No meu Rasp Pi passou de ~ 95% da CPU para ~ 35%.

kumar303
fonte
6

Entrada ALSA

Uma alternativa é ir via ALSA. Um comando semelhante ao acima seria

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

Não tenho certeza de como isso afetará o uso da CPU.

Alex Chamberlain
fonte
Tentei: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 Mas o ffmpeg falha após alguns segundos: [alsa @ 0x7a1510] buffer ALSA xrun. Alguma outra ideia?
hotips
Eu testei o ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234, mas o som é muito ruim ... o atraso é de cerca de 6 segundos. Alguma idéia de ter uma solução melhor?
hotips
1
@ si2w Acho que 32k para mp3 é uma piada. Ou então, ou tente um codec diferente. Talvez uma das séries G2xx projetados para telefones
Alex Chamberlain
3

Isso funciona e reduz o uso da CPU:

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

Certifique-se de substituir o padrão: CARD = U0x46d0x819 pelo ID do microfone (obtido de um registro -l) ou você especifica cad -i hw:0,0(ou qualquer outro dispositivo).

Eu tive um problema semelhante - a codificação mp3 ocupava mais de 90% da energia da CPU e simplesmente não conseguia acompanhar o áudio - então mudei para codificação mp2. Isso usou cerca de 15 a 18% da CPU (medida vi top) e transmite sem problemas para o VLC na minha LAN. Seria um monitor de bebê perfeito, ou o que quer. Há apenas um segundo mais ou menos, que é o buffer no final do VLC.

Nota: O endereço IP é um endereço multicast ([224-239] .xyz). Você não precisa apontar para um dispositivo de rede específico na sua LAN, e seu roteador de banda larga manterá o tráfego local (por padrão).

tim
fonte
2

Você pode reduzir significativamente a carga da CPU, reduzindo a taxa de amostragem de áudio do dispositivo de entrada ( -ar 8000 antes -f alsa ) e definindo a taxa de bits de áudio do codec para 128k ( -b:a 128k). Ironicamente, a redução do número de canais ( -ac 1) pareceu aumentar a carga da CPU, então eu achei esse comando executado em uma CPU bastante baixa:

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

Embora seja necessário lembrar que isso também depende dos recursos do hardware de captura que estamos tentando usar e das versões do ffmpeg / avconv.

Pierz
fonte