리눅스 서버에서 라이브 비디오를 스트리밍하는 방법?


30

여기 내가하고 싶은 일이 있습니다. 주위를 둘러 보았지만 정답을 찾지 못했습니다. Ubuntu / MySQL / Apache를 사용하여 웹 사이트를 실행하는 Linux 상자가 있습니다. 웹 호스팅을 사용하지 않는 자체 고정 IP도 있습니다. 랩톱 (아마도 Windows를 실행 중)의 웹캠에서 내 Linux 서버로 비디오 피드를 스트리밍하고 내 웹 사이트 중 하나의 사용자가 해당 비디오가 스트리밍되는 동안 라이브로 볼 수있게하고 싶습니다. 분명히 랩톱은 어떻게 든 서버로 인증해야하지만 웹 사이트에서 라이브 비디오를 볼 수있는 사람에 대한 제한은 없어야합니다. 감사.


그러한 솔루션을 구현하는 방법을 묻거나 즉시 사용 가능한 타사 솔루션을 찾고 있습니까? 전자의 경우 SO 잘못된 장소는이 질문에 대해, 나는 그것이 downvoting의 이유 믿는

답변:


46

현재 FireWire를 통해 연결된 3 개의 miniDV 카메라에서 온라인 스트리밍을 개발하고 있습니다. 이는 귀하의 요구와 매우 유사합니다.

빠른 힌트 : VLC + FlowPlayer / JW Player

우선 온라인 스트리밍에서 사용할 수있는 두 가지 비디오 형식 (FLV 및 h264)이 있습니다. FLV는 트랜스 코딩하기가 쉽고 h264는 크기 / 품질 비율이 더 좋지만 트랜스 코딩은 CPU를 훨씬 더 많이 사용합니다. 둘 다 웹 페이지에서 플래시 플레이어로 표시 할 수 있습니다.

둘째, 스트리밍 인프라. 랩탑 밴드는 제한되어 있기 때문에 (커플 Mbps 상단) 서버로 스트림을 가져 와서 클라이언트로리스트 림해야합니다. 따라서 스트림은 서버로 1 번 흐른 다음 거기서 클라이언트로 N 번 흐릅니다. 랩톱의 인터넷 연결에 대해 설명하지 않았으므로 시나리오는 두 섹션으로 나뉩니다.

  1. 랩톱이 공개 IP 주소로 연결되어 있거나 랩톱에 NAT 포트를 연결할 수 있습니다 . 이 시나리오는 서버에서 랩톱으로 훌륭하고 쉽게 연결할 수 있기 때문에 훨씬 쉽습니다. 큰 단점은 하나의 위치 (하나의 IP 주소)에 묶여 있다는 것입니다.

  2. 노트북이 공개 I 주소와 연결되어 있지 않습니다 . 이것은 약간 까다 롭지 만 모든 네트워크에서 작동하여 서버에 SSH로 연결하고 업로드가 충분합니다 (1 Mbps가 가능).

사용 된 시나리오에 관계없이 인프라 스트럭처는 다음과 같습니다.

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

노트북에서 스트리밍

  1. 웹캠에서 비디오를 캡처합니다 . 로컬로 연결된 웹캠에서 스트림을 캡처 한 적이 없지만 V4L을 통해이를 수행하는 방법에는 많은 예가 있습니다 (예 : Webcam Setup) . 관심을 가져야 할 유일한 부분은 다음과 같습니다.

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    웹캠에 연결하는 VLC 명령의 첫 번째 부분입니다. 자세한 내용은 언급 된 HOWTO를 따르십시오. 특히 "비디오 그룹"부분을보고 / dev / video 및 / dev / audio에 대한 장치 경로를 수정하십시오. 랩탑에서 다를 수 있습니다.

  2. 비디오를 FLV로 트랜스 코딩합니다 . FLV는 CPU 요구가 적기 때문에 개인적으로 사용합니다. 내가 사용하는 코드 변환 문자열은 다음과 같습니다.

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    MPGA 오디오를 사용하여 비디오 스트림을 FLV 형식으로 트랜스 코딩합니다 (MP3은 Ubuntu에서 사용할 수 없음). 샘플 레이트는 어떻게 든 필수이며, 그렇지 않으면 작동하지 않습니다. 그러나 22050과 같이 더 작은 크기를 선택할 수 있습니다. 이렇게하면 비디오 스트림이 '있는 그대로'트랜스 코딩되므로 스케일은 1 : 1입니다. 너비 및 높이 매개 변수를 추가하거나 스케일 매개 변수를 추가 할 수도 있습니다. VLC 설명서를 살펴보십시오.

  3. 노트북에서 스트리밍하십시오 . 이제 서버를 연결할 로컬 스트림을 만들어야합니다.

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    VLC 스트림을 0.0.0.0:8081/stream.flv에 바인딩합니다. 전체 명령은 다음과 같습니다.

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

서버에서 리 스트리밍

  1. 서버에서 스트림을 캡처하고 다시 스트리밍하십시오 . 다시 VLC를 사용하여 캡처 및 스트리밍합니다. 사용은이 게시물의 초기부터 인프라 시나리오를 기반으로합니다. 내가 보여준 것처럼 랩톱의 VLC는 일부 포트에서 비디오를 스트리밍합니다. 이 포트는 서버에서 액세스 할 수 있어야합니다. 랩톱 또는 NAT 포트의 공용 IP 주소가있는 경우 텔넷으로 테스트 할 수 있습니다.

    server$ telnet public_ip_address 8081

    "연결 시간 초과"를 제외한 모든 것이 노트북의 스트림에 연결할 수 있음을 나타냅니다. 공용 IP 주소가 없거나 NAT 포트를 사용할 수없는 경우 다른 방법으로 수행해야합니다. 랩톱에서 서버로 SSH하고 랩톱 포트를 서버로 원격 전달할 수 있습니다. 올바른 SSH 명령은 다음과 같습니다.

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    이 마법 명령은 랩톱 포트 8081을 서버 포트 8081에 '바인딩'합니다. 즉, 서버를 8081에 연결하면 SSH 터널을 통해 랩톱 포트 8081에 자동으로 연결됩니다. 쿨, 허? :) 이제 간단한 VLC 연결 및 스트리밍 만하면됩니다.

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    또는 공용 IP 주소 또는 NAT 포트의 경우 :

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    랩탑 부분에서와 같이 서버의 VLC는 포트 8082에 바인딩됩니다. 왜 8081이 아닌 8081입니까? SSH 원격 전달에서 8081을 이미 사용 중입니다. 첫 번째 예에서와 같이 트랜스 코딩 파트를 사용하지 않는 이유는 무엇입니까? 비디오는 이미 올바른 형식으로되어 있으므로 그대로 스트리밍하면됩니다.

  2. 테스트 . 두 예 모두 VLC를 통해 스트림을보고 기능을 테스트 할 수 있습니다. 로컬 스트림을 테스트 할 수 있습니다.

    laptop$ vlc http://localhost:8081/stream.flv

    그리고 서버 스트림을 테스트 할 수 있습니다 :

    laptop$ vlc http://server_ip_address:8082/stream.flv

    두 경우 모두 웹캠 입력이 표시되어야합니다.

웹에 스트림 표시

대부분의 경우 웹에서 스트림을 표시하는 것은 플래시 플레이어를 통해 이루어집니다. 비상업적 용도로는 무료 인 JW PlayerFlowplayer 두 가지 제품을 사용해 보았습니다 . Flowplayer에 머물 렀지 만 플러그인 (사용하지 않는 플러그인) 또는 더 나은 문서 때문에 이유를 기억하지 못합니다.

웹 페이지에 VLC에서 FLV 스트림을 표시하는 방법은 다음 과 같습니다. asf 및 Flash를 사용하여 VLC를 웹 사이트로 스트리밍

문제 해결

발생할 수있는 많은 문제에주의하십시오. 우선 모든 것에서와 같이 읽으십시오 . VLC는 매우 수다스러운 프로그램이므로 문제의 위치를 ​​알려줍니다. 비디오 / 오디오 장치에 액세스 할 수있는 권한, 누락 된 코덱, 철자가 틀린 --sout 매개 변수 iftop등의 문제 일 수 있습니다.


1
고마워요! 이것은 내가 예상했던 것보다 더 많은 정보였습니다. VLC를 확인하고 정보를 가이드로 사용합니다.

3

내가 선택한 도구는 vlc 입니다. 다목적 다중 형식 비디오 플레이어 일뿐만 아니라 다양한 파일 형식 및 스트리밍 프로토콜로 스트리밍 할 수 있습니다. 또한 Windows 및 Linux 호스트간에 크로스 플랫폼으로 작동합니다.

우리는 2 년 전에 좁은 대역폭의 DSL 회선 (128K 업스트림)을 사용하는 고객이 네트워크로 연결된 웹캠을 광범위한 청중에게 스트리밍해야했던 것과 유사한 것을 설정했습니다. "리플렉터"호스트로서의 VLC 설치는 캠 신호 회전을 수행하고, 스트리밍 클라이언트로부터 주요 대역폭로드를 취하여 다른 스트리밍 프로토콜 및 형식으로 스트림을 제시했다.


1

실제로 내 전문 분야는 아니지만 잠재적 인 방향으로 당신을 가리킬 수 있습니다.

상업적 구현은 Adobe의 Flash Media Server를 사용하는 것입니다. 물론 이는 다소 비용이 많이 드는 방법 일 수 있습니다. 그러나 Red5 와 같은 오픈 소스 대안이 있습니다. 서버를 설치해야합니다 (Java 종속성이 있음).

서버가 실행되면 프론트 엔드를 선택할 수 있습니다 (Red5에는 샘플이 포함되어 있다고 생각하지만 JW Player를 (type=camera) 함께 사용할 수도 있습니다 ).

프런트 엔드는 미디어 서버에서 스트리밍 비디오를 수신하고 스트림을 미디어 서버에 업로드합니다.

추가 정보 : Red5 도움말 및 정보Red5 참조


jwplayer는 개인적인 사용을위한 멋진 것입니다
Kendrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.