我尝试使用ffmpeg和外部USB麦克风流式传输实时音频。我遵循了这个差不多的教程

,我不得不调整一些步骤,但是最后,我实现了使用以下命令来接收笔记本电脑的流:

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


CPU接近100%,两秒钟后我的声音很差,什么也没反应...
我在Wireshark中看到板子连续发送帧。

有人有想法吗?降低CPU使用率?

评论

您可能需要研究超频和不同的内存分配。如果您选择编解码器,则可以通过切换实现一些改进。您可能还想研究流的压缩-尽管某些增益可能为零-您在传输时间中获得的任何收益都可能在压缩中丢失。

您是否尝试过首先写入本地文件?我会尝试逐步进行:1)实时录制到wave文件,2)实时录制到mp3文件3)通过网络流式传输内容

现在不行。手动执行所有这些步骤而不是全自动ffmpeg似乎很复杂;-)

你在录音什么?

我正在尝试制作以太网婴儿电话

#1 楼

要回答您的特定问题,可以通过将记录传送到ffmpeg中来减少CPU:

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%的CPU变为了〜35%的CPU。

#2 楼

ALSA输入
一种选择是通过ALSA。与上面类似的命令是
ffmpeg -ac 1 -f alsa -i hw:0,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://localhost:1234

我不确定这将如何影响CPU使用率。

评论


我试过了:ffmpeg -ac 1 -f alsa -i硬件:1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://192.168.1.116:1234但是ffmpeg在几秒钟后崩溃:[[alsa @ [0x7a1510] ALSA缓冲区xrun。还有其他想法吗?

– Hotips
2012年8月10日在21:48

我测试了ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp://192.168.28.116:1234,但声音非常糟糕...滞后时间约为6秒。有更好的解决方案吗?

– Hotips
2012年8月10日在22:27

@ si2w我认为mp3的32k有点笑话。要么解决,要么尝试其他编解码器。也许是为电话设计的G2xx系列之一

–亚历山大·张伯伦
2012年8月11日7:47

#3 楼

这有效并减少了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 &


请确保将默认值:CARD = U0x46d0x819替换为您的麦克风ID(从arecord -l获取)或cad指定-i hw:0,0 (或者它是哪种设备)。

我遇到了类似的问题-mp3编码占用了90%以上的cpu功率,无法跟上音频的速度-因此我将其更改为mp2编码。这使用了大约15-18%的CPU(通过vi top测量),并顺利地流到我LAN上的VLC。这将是一个完美的婴儿监视器,或者其他任何东西。只有一秒钟左右的延迟,这是VLC端的缓冲。

注意:IP地址是一个多播地址([224-239] .x.y.z)。您不必将其瞄准局域网中的特定网络设备,并且宽带路由器会将流量保持在本地(默认情况下)。

#4 楼

您可以通过降低输入设备的音频采样率(-ar 8000之前的-f alsa)并将编解码器音频比特率设置为128k(-b:a 128k),来显着降低CPU负载。具有讽刺意味的是,减少通道数(-ac 1)似乎增加了CPU负载,因此我发现此命令在相当低的CPU上运行:

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


尽管需要记住它也取决于要使用的捕获硬件的功能以及ffmpeg / avconv的版本。