리눅스 서버에서 라이브 비디오를 스트리밍하는 방법? MySQL / Apache를 사용하여 웹

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



답변

현재 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등의 문제 일 수 있습니다.


답변

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

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


답변

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

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

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

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

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