我正在尝试设置一个 Docker 环境,在其中使用 NGINX RTMP 服务器和 PHP 容器使用 HLS 文件将视频流式传输到 YouTube Live。该设置涉及在容器之间共享卷以及在 PHP 容器中使用 FFmpeg 来启动实时流。但是,我遇到了一个问题:FFmpeg 在尝试连接到 YouTube 的 RTMP 服务器时无法解析主机名。
设置详情: Docker 撰写配置:
docker-compose.yml
version: '2'
services:
rtmp:
image: tiangolo/nginx-rtmp
ports:
- "1935:1935"
volumes:
- shared_data:/usr/share/nginx/hls
- ./conf/nginx.conf:/etc/nginx/nginx.conf
php:
build: .
ports:
- "8080:80"
volumes:
- shared_data:/var/www/html/hls
- ./src:/var/www/html
security_opt:
- seccomp:unconfined
volumes:
shared_data:
Dockerfile
FROM php:apache
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN curl -O https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && \
tar -xJf ffmpeg-release-amd64-static.tar.xz && \
mv ffmpeg-*/ffmpeg /usr/local/bin/ && \
mv ffmpeg-*/ffprobe /usr/local/bin/ && \
rm -rf ffmpeg-*
./conf/nginx.conf
worker_processes auto;
rtmp_auto_push on;
events {}
rtmp {
server {
listen 1935;
listen [::]:1935 ipv6only=on;
access_log /var/log/rtmp_access.log;
chunk_size 4096;
timeout 10s;
application live {
live on;
record off;
hls on;
hls_path /usr/share/nginx/hls;
hls_fragment 10s;
}
}
}
使用nginx容器从相机(gopro)接收rtmp。 php容器提供了用于流管理等的UI,并通过ffmpeg进行分发。 收到的hls是由docke的共享卷共享的。
FFmpeg 命令失败:
ffmpeg -re -i "/var/www/html/hls/.m3u8" -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -flags +global_header -bsf:a aac_adtstoasc -bufsize 3000k -f flv "rtmp://a.rtmp.youtube.com/live2/live_key"
错误信息
[tcp @ 0x696d2c0] Failed to resolve hostname a.rtmp.youtube.com: System error
[rtmp @ 0x696d480] Cannot open connection tcp://a.rtmp.youtube.com:1935?tcp_nodelay=0
[out#0/flv @ 0x6890880] Error opening output rtmp://a.rtmp.youtube.com/live2/live_key: Input/output error
Error opening output file rtmp://a.rtmp.youtube.com/live2/live_key.
Error opening output files: Input/output error
成功FFmpeg命令:
ffmpeg -re -i "/var/www/html/hls/.m3u8" -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -flags +global_header -bsf:a aac_adtstoasc -bufsize 3000k -f flv "rtmp://74.125.203.134/live2/live_key"
不使用域名,而是使用ip。
我尝试过的:
我在我的主机(macOS)上安装了 FFmpeg 并运行了以下命令,没有任何问题,表明该问题特定于 Docker 容器环境。
ffmpeg -re -i "http://localhost:8080/hls/.m3u8" -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -flags +global_header -bsf:a aac_adtstoasc -f flv "rtmp://a.rtmp.youtube.com/live2/live_key"
在 PHP 容器内,我运行 nslookup a.rtmp.youtube.com 并获得多个 IP 地址,这表明 DNS 解析应该可以工作:
nslookup a.rtmp.youtube.com
Server: 240b:11:cc40:d500:23a:9dff:fe92:75a8
Address: 240b:11:cc40:d500:23a:9dff:fe92:75a8#53
Non-authoritative answer:
Name: a.rtmp.youtube.com
Address: 74.125.203.134
...
使用 FFmpeg 流式传输到 YouTube Live 时,什么可能导致 Docker 容器内的 DNS 解析问题?如何解决此问题,以便域名在 Docker 容器内的 FFmpeg 命令中正常工作?
任何见解或解决方案将不胜感激!
ffmpeg 的
7.0.1
版本表示有关 DNS 的更改。
静态链接 glibc 的一个限制是 DNS 解析的丢失。安装中 通过你的包管理器 nscd 将解决这个问题。
https://johnvansickle.com/ffmpeg/release-readme.txt
以前版本的 ffmpeg 是否有同样的问题?
这里建议一些解决方案:FFMPEG“网络流源的分段错误”