Đã thử nghiệm trên Raspberry Pi 4B với
Raspbian Buster With Desktop 2020/02/13 được cập nhật vào ngày 2020-04-18.
Raspbian Buster Lite 2020/02/13 được cập nhật vào ngày 2020 / 03-26.
Cập nhật được thực hiện với sudo apt update && sudo apt full-upgrade && sudo reboot
.
Với raspi, bạn nên kết nối với mạng cục bộ và với đầu ra âm thanh của bạn (tai nghe, bộ khuếch đại, v.v.). Trước tiên, bạn có thể kiểm tra đầu ra âm thanh của mình với tệp âm thanh nhỏ work.wav này . Tất nhiên bạn có thể thực hiện bất kỳ kiểm tra đầu ra âm thanh khác.
pi ~$ sudo apt install alsa-utils
pi ~$ aplay working.wav
Nếu bạn nghe rằng nó hoạt động thì hãy cài đặt gmediarender
với các plugin cần thiết:
pi ~$ sudo apt install gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad gstreamer1.0-gl gmediarender
Chạy thử nghiệm: hãy chắc chắn rằng bạn là thành viên của nhóm âm thanh và video . Bạn có thể hủy bài kiểm tra với Ctrl+ C.
pi ~$ /usr/bin/gmediarender --friendly-name Test --uuid 42 --gstout-initial-volume-db -20 --logfile /dev/stdout
Trên điểm kiểm soát của bạn (bubbleUPNP hoặc đại loại như thế này), bạn nên tìm một trình kết xuất có tên Test
. Chọn nó và phát nhạc từ máy chủ phương tiện của bạn nếu bạn có. Điều này hoạt động trên Raspbian Buster Light nhưng trên Raspbian Buster With Desktop , đầu ra gỡ lỗi trên màn hình cho thấy mọi thứ nên làm, nhưng không có âm thanh để nghe. Có vẻ như phiên bản Desktop cài đặt thêm một số thư viện bổ sung gây nhầm lẫn cho gmediarender nên sử dụng đầu ra nào. Tôi đã phải nối --gstout-audiosink alsasink
vào cuộc gọi thử nghiệm được hiển thị ở trên.
Tôi cũng tìm thấy một cảnh báo khó hiểu:
** (gmediarender:4222): CRITICAL **: 11:38:55.673: file gstdtlsagent.c: line 192 (gst_dtls_agent_init): should not be reached
** (gmediarender:4222): CRITICAL **: 11:38:55.673: gst_dtls_agent_set_property: assertion 'self->priv->ssl_context' failed
Với một số googling tôi thấy rằng nó không quan trọng (3) và bạn có thể triệt tiêu nó bằng cách đặt một chuỗi trống thành OPENSSL_CONF = "" . Vì vậy, một cuộc gọi thử nghiệm hoàn chỉnh trên bản cài đặt Buster Desktop của tôi trông như thế này:
OPENSSL_CONF="" /usr/bin/gmediarender --friendly-name Test --uuid 42 --gstout-initial-volume-db -20 --logfile /dev/stdout --gstout-audiosink alsasink
Nếu nó hoạt động thì hãy định cấu hình /etc/default/gmediarender
, đặt UPNP_DEVICE_NAME và INITIAL_VOLUME_DB nếu bạn muốn. Đừng sử dụng các ký tự "đặc biệt" như umlaut hoặc như vậy. Khởi động sẽ thoát với một thông báo lỗi. Có vẻ như gmediarender vẫn không hiểu UTF-8 :-(
Nếu bạn có nhiều hơn một raspi với gmediarender đang chạy trên mạng của mình, bạn nên cung cấp cho mỗi UUID khác nhau. Các điểm kiểm soát sau đó có thể phân biệt trình kết xuất phương tiện khác nhau trong các tin nhắn upnp. Nối một cái gì đó như thế này vào /etc/default/gmediarender
:
DAEMON_EXTRA_ARGS="--uuid f4f7681c-3056-11e8-86bd-87a6e4e2c42d"
Bạn có thể nhận UUID mới với chương trình uuid
(cài đặt với sudo apt install uuid
).
Nếu bạn chỉ có một giao diện trên RasPi thì bạn đã hoàn tất cài đặt. Chỉ cần bắt đầu gmediarender như dịch vụ:
pi ~$ sudo systemctl enable gmediarender.service
pi ~$ sudo systemctl start gmediarender.service
Tôi gặp vấn đề là tôi sử dụng gmediarender trên RasPi với kết nối mạng có dây và với một điểm truy cập để tôi có hai giao diện với một địa chỉ IP. Gmediarender liên kết với một trong số họ và tất nhiên là sai. Bạn phải chỉ định địa chỉ IP của giao diện /etc/default/gmediarender
nên được sử dụng. Nhưng giao diện của tôi được cấu hình bởi DHCP để địa chỉ IP có thể thay đổi theo thời gian. Để giải quyết vấn đề này, tôi đã tạo một tập lệnh bash nhỏ lấy địa chỉ IP hiện tại từ giao diện và ghi nó vào /etc/default/gmediarender
. Đây là kịch bản:
rpi ~$ cat /usr/local/sbin/gmediarender-setip.sh
#!/bin/bash
# This script binds gmediarender to an interface given in "$1".
# Gmediarender needs the ip address of the interface. The current ip address
# is taken from the interface and set in /etc/default/gmediarender.
if [ $# -eq 0 ]; then
echo 'no interface name given'
exit 1
fi
IPADDR="0.0.0.0"
IPADDR=$(/sbin/ip -4 -br addr show $1 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")
CMD="s/\(DAEMON_EXTRA_ARGS=.*--ip-address=*\)[^ \"]*/\1$IPADDR/"
/bin/sed -i "$CMD" /etc/default/gmediarender
Đừng quên đặt quyền và chỉ thực hiện quyền cho root:
rpi ~$ sudo chown root:root /usr/sbin/gmediarender-setip.sh
rpi ~$ sudo chmod 754 /usr/sbin/gmediarender-setip.sh
Sau đó thực thi tập lệnh này ngay trước khi bắt đầu gmediarender bằng cách mở rộng dịch vụ của nó với:
rpi ~$ sudo systemctl edit gmediarender.service
Trong trình chỉnh sửa trống, chèn các câu lệnh này bằng tên giao diện của riêng bạn, lưu chúng và thoát khỏi trình soạn thảo:
[Service]
ExecStartPre=/usr/local/sbin/gmediarender-setip.sh eth0
Trong /etc/default/gmediarender
bộ ít nhất
DAEMON_EXTRA_ARGS="--ip-address=0.0.0.0"
# or e.g.
DAEMON_EXTRA_ARGS="--uuid f4f7681c-3056-11e8-86bd-87a6e4e2c42d --ip-address=0.0.0.0"
Nếu không, tập lệnh sẽ không tìm thấy địa chỉ IP được thay đổi. Sau đó bắt đầu gmediarender như dịch vụ:
pi ~$ sudo systemctl enable gmediarender.service
pi ~$ sudo systemctl start gmediarender.service
tài liệu tham khảo:
[1] https://github.com/hzeller/gmrender-resurrect
[2] https://joachim-wilke.de/blog/2016/07/10/UPNP-Renderer-auf-dem-Raspberry-Pi /
[3] https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/811#note_117235