首页 > 解决方案 > 如何通过 ssh 调用 AAC 音频流功能

问题描述

我有一个 USB 音频加密狗连接到 QNAP NAS 上的 USB 端口。我在 NAS 上有一个名为“radio”的脚本,它通过 USB 音频加密狗将互联网广播流传输到条形音箱。整个过程由 Raspberry Pi(带有 Domoticz 家庭自动化系统)控制。我的意思是 RPi 向 NAS 发送 ssh 命令以在 NAS 上运行脚本“radio”。只要它是 HTTP MP3 流,一切都可以正常工作。然后我使用mpg123,即转换MP3到WAV。对于 AAC 流,我必须使用 FFMPEG 将 AAC 转换为 WAV,这是播放所需的。不幸的是,NAS 上可用的命令数量非常有限,我只能使用 FFMPEG 和 APLAY。如果我在 NAS 上直接(从控制台)运行“无线电”脚本,一切正常。但是,当我从 RPi 远程运行它时,MP3 流可以正常播放,但 AAC 不能。以下是我目前在 NAS 上的“无线电”脚本中使用的命令(经过多次尝试)。当我从 NAS 控制台运行它时,一切正常。但是,当我使用带有 RPi 的 SSH 远程运行它时,FFMPEG 和 APLAY 都会启动,但 NAS 上没有播放任何内容。

....
[ ! -e /dev/shm/pipe ] && $path_bin/mkfifo /dev/shm/pipe
....
ffmpeg -y -i "$url" -vn -acodec pcm_s16le -ar 44100 -f wav /dev/shm/pipe & $path_bin/aplay -D   sysdefault:Device --file-type raw --format=cd /dev/shm/pipe
....

如果我从 NAS 控制台运行“无线电”脚本,FFMPEG 开始显示接收/转码 kbits 的计数器。当我远程调用它时,计数器不会在 RPi 控制台上启动。可能 FFMPEG 可以工作,但不能转码流。知道如何正确运行广播流媒体吗?

EDIT-1 标准错误输出:

ffmpeg version 3.3.6 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.9.2 (Debian 4.9.2-10)
  configuration: --enable-cross-compile --arch=i686 --target-os=linux --disable-yasm --disable-static --enable-shared --enable-gpl --enable-libmp3lame --disable-libx264 --enable-libsoxr --enable-version3 --enable-nonfree --enable-openssl --disable-decoder=ac3 --disable-decoder=ac3_fixed --disable-decoder=eac3 --disable-decoder=dca --disable-decoder=truehd --disable-encoder=ac3 --disable-encoder=ac3_fixed --disable-encoder=eac3 --disable-encoder=dca --disable-decoder=hevc --disable-decoder=hevc_cuvid --disable-encoder=hevc_nvenc --disable-encoder=nvenc_hevc --disable-decoder=h264 --disable-decoder=h264_cuvid --disable-encoder=libx264 --disable-encoder=libx264rgb --disable-encoder=h264_nvenc --disable-encoder=nvenc --disable-encoder=nvenc_h264 --disable-decoder=mpeg2video --disable-decoder=mpegvideo --disable-decoder=mpeg2_cuvid --disable-encoder=mpeg2video --disable-decoder=mpeg4 --disable-decoder=mpeg4_cuvid --disable-decoder=msmpeg4v1 --disable-decoder=msmpeg4v2 --disable-decoder=msmpeg4v3 --disable-encoder=mpeg4 --disable-encoder=msmpeg4v2 --disable-encoder=msmpeg4v3 --disable-decoder=mvc1 --disable-decoder=vc1 --disable-decoder=vc1_cuvid --disable-decoder=vc1image --disable-decoder=aac --disable-decoder=aac_fixed --disable-decoder=aac_latm --disable-encoder=aac --extra-ldflags='-L/root/daily_build/64_41/4.5.1/LinkFS/usr/lib -L/root/daily_build/64_41/4.5.1/Model/TS-X72/build/RootFS/usr/local/medialibrary/lib -Wl,--rpath -Wl,/usr/local/medialibrary/lib' --extra-cflags='-I/root/daily_build/64_41/4.5.1/LinkFS/usr/include -I/root/daily_build/64_41/4.5.1/Model/TS-X72/build/RootFS/usr/local/medialibrary/include -D_GNU_SOURCE -DQNAP' --prefix=/root/daily_build/64_41/4.5.1/Model/TS-X72/build/RootFS/usr/local/medialibrary
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100

标签: sshffmpegstreaming

解决方案


最后我找到了一个解决方法。这不是一个“优雅”的解决方案——但它确实有效。我使用了“expect”功能并在 RPi 上创建了一个脚本,该脚本触发 SSH 流式传输到 NAS。脚本内容如下。

#!/usr/bin/expect -f
set channel [lindex $argv 0]
set timeout 5
spawn /usr/bin/ssh -p669 -x -q -i /home/debian/.ssh/id_debian admin@192.168.0.7 
expect "*# "
send -- "/share/homes/media/Pobrane/RADIO/radio $channel\r"
expect "*# "
send -- "exit\r"
expect eof

就这样。


推荐阅读