Docker 容器中的 FFmpeg 问题:RTMP 流“无法解析主机名”

问题描述 投票:0回答:1

我正在尝试设置一个 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。

我尝试过的:

  1. 在主机上运行 FFmpeg:

我在我的主机(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"
  1. DNS解析:

在 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 命令中正常工作?

任何见解或解决方案将不胜感激!

docker dns rtmp
1个回答
0
投票

ffmpeg 的

7.0.1
版本表示有关 DNS 的更改。

静态链接 glibc 的一个限制是 DNS 解析的丢失。安装中 通过你的包管理器 nscd 将解决这个问题。

https://johnvansickle.com/ffmpeg/release-readme.txt

以前版本的 ffmpeg 是否有同样的问题?

这里建议一些解决方案:FFMPEG“网络流源的分段错误”

© www.soinside.com 2019 - 2024. All rights reserved.