FFMPEG를 사용하여 HLS를 TVHEADEND로 스트리밍하려고 합니다. 하지만 "호스트를 찾을 수 없음", "호스트에 대한 경로 없음" 및 TLS 핸드셰이크 오류가 계속 발생하기 때문에 작동할 수 없습니다.
테스트하기 위해 이 명령을 실행하여 privateurl.com을 내 개인 스트림 URL로 바꿨습니다.
ffmpeg -user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100Safari/537.36" -i "https://privateurl.com:8443/stream/stream.m3u8" -c copy -f mpegts test.ts
이것은 Windows(FFMPEG 빌드 3.4.2)에서는 완벽하게 작동하지만 내 Debian 서버(Proxmox)에서는 똑같은 명령을 사용하여 안정적인 연결을 설정할 수 없습니다. LXC 컨테이너 내에서 FFMPEG 버전 3.2.12-1~deb9u1 및 ffmpeg 버전 3.4.4를 사용하여 테스트했는데 결과는 두 경우 모두 동일했습니다. HLS는 작은 덩어리의 ts 스트림으로 구성되어 있기 때문에 서버에 대한 연결이 잘못된 것처럼 보이는 다양한 유형의 오류를 주장하는 일부 덩어리에 무작위로 연결하지 못하는 것 같습니다. 그런데 그 이유는 무엇입니까? Windows 서버와 Linux 서버가 모두 동일한 라우터에 연결되어 있고, 서버가 이더넷을 통해 직접 연결되어 있기도 하지만(케이블을 바꿔봐도) 여전히 안정적인 스트림 연결이 이루어지지 않습니다. 한 블록을 간헐적으로 연결하고 전송할 수 있지만 다른 블록에서는 무작위로 중지됩니다. 서버의 FFMPEG 오류 출력은 다음과 같습니다.
...
[tls @ 0x7f49f08eea40] The specified session has been invalidated for some reason.
[tcp @ 0x55efbe455aa0] Connection to tcp://privateurl.com:8443 failed (Host is unreachable), trying next address
Last message repeated 1 times
[hls,applehttp @ 0x7f49f08ee160] Opening 'https://privateurl.com:8443/stream/stream_982112.ts' for reading
[tcp @ 0x55efbe02fbc0] Connection to tcp://privateurl.com:8443 failed (Host is unreachable), trying next address
Last message repeated 1 times
[tcp @ 0x55efbe503280] Connection to tcp://privateurl.com:8443 failed (Host is unreachable), trying next address
Last message repeated 1 times
[tls @ 0x55ba15827580] The TLS connection was non-properly terminated.
...
VLC도 마찬가지입니다. Windows에서는 스트림을 재생하는데 오류 없이 완벽하게 실행됩니다. VLC 서버 측을 실행하면 짧은 시간 동안 스트림이 간헐적으로 작동하고 콘솔은 TLS로 스팸 처리되며 다음과 같은 호스트 오류에 대한 경로가 없습니다.
...
[00007fec88000ef0] main tls client error: TLS session handshake error
[00007fec88000ef0] main tls client error: connection error: No route to host
[00007fec88000ef0] gnutls tls client error: TLS handshake error: Error in the push function.
[00007fec88000ef0] main tls client error: TLS session handshake error
[00007fec88000ef0] main tls client error: connection error: No route to host
[00007fec88000ef0] gnutls tls client error: TLS handshake error: Error in the push function.
[00007fec88000ef0] main tls client error: TLS session handshake error
[00007fec88000ef0] main tls client error: connection error: No route to host
...
나는 Traceroute, tcptraceroute, ping privateurl.com 및 해당 포트를 사용해 보았고 이러한 명령을 사용하려고 할 때 오류가 발생하더라도 항상 완벽하게 작동합니다.
이제 저는 이 작업을 수행하는 방법이나 문제의 원인을 파악하는 방법을 전혀 모릅니다. 나에게는 Linux의 TLS 스택이 손상되었거나 FFMPEG 버그인 것 같지만 왜 Windows에서는 작동하지만 내 Linux 서버에서는 작동하지 않는지 모르겠습니다.
누구든지 아이디어가 있나요?
답변1
그래서 마침내 수수께끼가 풀렸습니다. IPv6를 비활성화하면 문제가 해결되었습니다.
/etc/sysctl.conf에 추가하여 IPv6을 비활성화했습니다.
선:
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
이것은 실제 수정에 가깝습니다. IPv6를 올바르게 구성하면 이 문제도 해결됩니다. 하지만 제 경우에는 지금은 IPv6를 비활성화하는 것만으로도 충분합니다.
이 주제에 대한 추가 의견을 주신 @peterh에게 감사드립니다. 앞으로 IPv4와 IPv6를 구별할 수 있는 더 나은 오류 메시지가 있기를 바랍니다.