EasyDarwin + ffmpeg를 사용하여 스트리밍 미디어 서버를 구축하여 여러 스마트 TV에서 프로모션 비디오를 동시에 재생할 수 있습니다.

최근 세대 내 사용자들이 세대 내 9대의 안드로이드 스마트 TV(샤오미 TV)에서 사용자가 제공하는 홍보 영상을 동시에 재생해 달라고 요청했으며, 모든 TV 오디오와 영상이 동시에 재생되기를 바랍니다. 매점 및 내장 스피커를 사용하십시오. TV 간의 오디오 지연이 다르면 잔향이 발생할 수 있습니다.)

TV를 설치할 때 전원 코드만 남겨두었기 때문에 HDMI 분배기를 사용하려면 케이블을 다시 배선해야 했고, 동시에 무선 방송 동일 화면 시스템의 구입 가격이 상대적으로 비싸기 때문에 최종적으로 사용하기로 결정했습니다. 연구 끝에 회사의 기존 WLAN 인프라를 무선 LAN에 스트리밍 미디어 서버를 구축하고, 스마트 TV에 스트리밍 미디어 플레이어를 설치해 서버의 영상을 실시간으로 시청할 수 있습니다.

테스트 후, RTSP+UDP 프로토콜을 사용하여 초당 1080P 25프레임 비디오를 재생하면 각 TV에서 오디오 및 비디오 동기화를 달성할 수 있으며 그 효과는 HDMI 분배기와 비슷합니다. 이 솔루션의 구현 프로세스를 공유해 보겠습니다.

본 글의 사상에 따르면, 무선 네트워크를 통해 국내 방송국의 실시간 방송 및 홍보 영상을 여러 대의 TV에 구현하는 시나리오가 가능하다.물론 구체적인 적용 효과도 실제 상황에 따라 달라진다. 기업의 네트워크 환경 및 멀티미디어 장비 구성.

1. 네트워크 채널 디버깅

데스크톱 컴퓨터를 스트리밍 미디어 서버로 사용하고 LAN에 대한 유선 액세스를 사용합니다. IP 주소는 정적으로 할당되며 DHCP를 사용하지 않습니다. TV는 무선 액세스를 사용하고 IP는 동적일 수 있지만 IP 주소는 동적이어야 합니다. NAT를 통하지 않고 스트리밍 미디어 서버에 ping을 보낼 수 있습니다. .

2. EasyDarwin 구성

테스트 결과, RTMP 스트리밍을 사용할 때 TV 간의 오디오 및 비디오 지연이 크게 달라지는데, 이는 RTMP 프로토콜이 TCP 전송을 사용하고 네트워크 환경에 더 민감하기 때문이며, RTSP(UDP)를 사용하여 스트리밍을 푸시할 때 가장 좋은 효과를 얻을 수 있습니다. .

스트리밍 미디어 서버에는 다양한 옵션이 있습니다. EasyDarwin 외에도 Live555, Nginx(및 RTMP 플러그인), SRS, OBS, VLC, rtsp-simple-server 등이 있습니다. 그중 OBS와 VLC가 통합되었습니다. 스트리밍 구성요소와 서버 ffmpeg 없이 단독으로 사용해도 되지만, 테스트 해본 결과 OBS는 RTSP 플러그인을 잘 지원하지 않고, VLC 스트리밍은 비디오 루프 재생에 문제가 좀 있어서 결국 국내 오픈소스인 EasyDarwin을 선택했습니다.

참고: rtsp-simple-server도 사용할 수 있습니다. rtsp-simple-server에는 웹 관리 기능이 없고 시스템 리소스를 덜 차지하며 네트워크 보안 위험이 낮습니다.

1. EasyDarwin을 다운로드하고 시스템(Win 또는 Linux)에 따라 해당 릴리스 패키지를 선택합니다.

릴리스 · EasyDarwin/EasyDarwin (github.com)

2. 다운로드 완료 후 압축을 풀어주세요

2e5a69326708478081a1077436adc15e.png

(1) EasyDarwin에서 RTSP는 기본 포트 554를 사용하며 easydarwin.ini에서 수정할 수 있으며 여기서는 8554로 변경됩니다.

 919ca947f4c34281bccdcad34fd1a5db.png

 (2) EasyDarwin.exe를 실행하여 서비스를 시작합니다.

3. ffmpeg 구성

FFmpeg는 오디오 및 비디오 파일을 처리하는 데 사용할 수 있는 크로스 플랫폼 무료 소프트웨어입니다. 오디오 및 비디오 데이터 처리를 위한 라이브러리 및 도구 세트를 제공하며, 오디오 및 비디오에 대한 디코딩, 인코딩, 변환, 가로채기, 병합 및 기타 작업을 수행할 수 있으며 다양한 오디오 및 비디오 형식을 지원합니다. FFmpeg는 스트리밍 미디어 서버, 비디오 편집 소프트웨어, 플레이어 등을 포함한 멀티미디어 관련 응용 프로그램 및 시스템에 널리 사용됩니다.

오디오 및 비디오 개발에 참여한 학생들은 ffmpeg에 익숙해야 합니다. 관련 사용법은 여기서 반복하지 않습니다. 이 기사에서 ffmpeg는 주로 스트림을 EasyDarwin으로 푸시하는 데 사용되며 EasyDarwin은 RTSP 스트림을 TV 플레이어에 예약하고 배포합니다.

1. ffmpeg 다운로드 공식 웹사이트에서 해당 시스템 버전을 선택하여 다운로드합니다.

FFmpeg 다운로드

2. 다운로드한 압축 패키지를 D:/에 추출하고 추출된 폴더의 이름을 ffmpeg로 바꿉니다.

3. ffmpeg 명령을 쉘에서 직접 호출하려면 사용자와 시스템의 Path 환경변수에 "D:\ffmpeg\bin"을 추가합니다.

c2401863f60e4183954019e9158e962c.png

 4. 푸시 흐름 테스트

(1) 테스트하기 전에 EasyDarwin을 시작하십시오. 이전 섹션을 참조하십시오.

(2) 푸시해야 하는 비디오 파일(video.mp4)을 D:\share\에 넣습니다.

(3) 쉘을 열고 다음을 입력하십시오.

ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -c copy -f rtsp rtsp://127.0.0.1:8554/live

안에,

  • -re: 실시간 모드에서 입력 파일을 읽습니다. 즉, 입력 스트림을 일반 속도로 읽습니다.
  • -stream_loop -1: 수동으로 중지할 때까지 입력 파일을 반복합니다.
  • -i "D:\share\video.mp4": 푸시할 영상 파일의 경로를 지정합니다.
  • -c copy: 인코딩이나 디코딩 작업을 수행하지 않고 원본 데이터를 출력 스트림에 직접 복사합니다. 비디오 비트 전송률이 큰 경우 해상도 및 프레임 속도 압축과 같은 작업이 필요합니다.
  • -f rtsp: 출력 스트림의 형식을 RTSP로 지정하며, 기본적으로 데이터 스트림 전송에는 UDP, 제어 스트림 전송에는 TCP가 사용됩니다.
  • rtsp://127.0.0.1:8554/live: 출력 스트림의 URL을 지정합니다.스트리밍 서버와 ffmpeg가 동일한 터미널에 있으므로 여기서는 127.0.0.1을 사용할 수 있으며, 서로 다른 경우 여기의 IP를 EasyDarwin을 실행하는 머신의 IP로 변경해야 합니다.

 명령이 실행되면 점프 프레임 속도와 시간이 하단에 나타나 스트림이 EasyDarwin에 성공적으로 시작되었음을 증명합니다. 이때 세션 시작은 EasyDarwin 인터페이스에서 볼 수 있으며, EasyDarwin 웹 인터페이스 http://127.0.0.1:10008/ 에 접속하면 자세한 정보를 볼 수 있습니다.

63a54233b41842ffa6725e573c865d0a.png

4. 스트리밍을 위해 스마트 TV에 VLC를 설치합니다.

테스트 후 OPlayer와 VLC(v3.5.4 베타 버전 사용, 다른 버전은 테스트 후 성공적으로 설치되지 않음) 모두 Android 스마트 TV(Xiaomi TV)에서 안정적인 RTSP 스트리밍 재생을 달성할 수 있지만 다음 문제에 유의해야 합니다.

  • 단일 비디오 루프 재생만 구현해야 한다면 opplayer로 충분합니다.
  • 여러 비디오를 반복해서 반복해야 하는 경우(목록 루프) 다음 섹션의 스크립트를 사용할 수 있습니다. 이때 VLC 플레이어를 사용하고 VLC의 루프 모드를 단일 비디오 루프로 설정해야 합니다( 비디오 오른쪽 하단에 있는 3개를 클릭하십시오. 버튼을 클릭하고 "루프 모드"를 켜십시오.) 이 설정은 기억할 수 있으며 한 번만 설정할 수 있습니다(OPlayer에서도 루핑을 설정할 수 있지만 루프 모드는 이후에 기억할 수 없습니다). 재생을 종료합니다. 매번 조작해야 하므로 더 번거롭습니다.)

참고: VLC는 기본적으로 Android 스마트 TV의 TV 버전 UI로 설정됩니다. 스트리밍 미디어 재생 모듈이 깊게 숨겨져 있어 빠른 작업에 도움이 되지 않습니다. 다음 방법을 사용하여 개선할 수 있습니다.

(1) 무선 키보드와 마우스를 사용하여 수신 모듈을 스마트 TV의 USB 포트에 삽입합니다.

(2) VLC에서: 설정 > 인터페이스 > "Android TV 인터페이스" 선택을 취소합니다. 이 때 설정을 변경하려면 마우스를 사용하여 슬라이더를 드래그해야 합니다.

(1) VLC를 사용하는 경우 VLC에서: 더보기 > 새 스트리밍 이전 섹션에서 구성한 RTSP 주소를 입력합니다. 이때 이전 단계의 127.0.0.1을 스트리밍 미디어 서버의 IP로 바꿔야 합니다. 네트워크. 예를 들어 스트리밍 미디어 서버 IP는 172.16.0.2, 포트는 8554, 경로는 /live입니다.

RTSP://172.16.0.2:8554/라이브

(2) OPlayer를 사용하는 경우 작업은 유사하며 반복되지 않습니다.

5. 스트리밍 명령 최적화

4단계에서 푸시 테스트 시 사용한 명령어는 오디오 및 비디오 인코딩 작업을 수행하지 않았으며, 푸시 소스 파일의 해상도/프레임 레이트/비트 레이트가 큰 경우 네트워크 및 기기 성능상의 이유로 지연이 발생할 수 있으므로, 또는 완전히 재생할 수 없습니다.

다음은 프로덕션 환경에서 테스트한 푸시 명령입니다. 이 명령은 최대 해상도를 1920×1080, 프레임 속도를 25fps, 평균 비트 전송률을 1500K로 제한합니다. 인코딩 품질은 재생되지 않도록 더 빠르게 설정됩니다. 고화질 동영상을 시청할 때 끊김 현상이 발생합니다.

ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/tv

그 중 원래 푸시 명령을 최적화하기 위해 다음 매개변수가 추가되었습니다.

  • -vf  매개변수: 비디오 필터 적용

  • -c:v libx264매개변수: 비디오 인코더를 libx264로 지정합니다.

  • -preset faster매개변수: 인코딩 속도와 압축 비율 사이의 균형을 설정합니다. -preset에는 특정 환경에 따라 조정할 수 있는 여러 옵션이 있습니다. 여기서는 Faster가 사용됩니다.

  • -tune zerolatency매개변수: 대기 시간을 줄이기 위해 인코더의 매개변수를 설정합니다.

  • -vb 1500K매개변수: 비디오 비트 전송률을 1500Kbps로 설정합니다.

注1:

-vf다음 옵션은 매개변수 scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25에 지정됩니다.

안에:

  • scale: 입력 비디오를 지정된 크기로 조정합니다. 출력 비디오의 너비와 높이를 나타내며, w기능은 출력 비디오의 화면비가 입력 비디오와 일치하도록 최소값을 선택하는 데 사용됩니다.hmin
  • force_original_aspect_ratio: 크기 조정된 비디오 종횡비가 입력 비디오와 동일하도록 지정합니다.
  • decrease: 영상을 확대할 때 크기를 줄일 수는 있지만 늘릴 수는 없음을 나타냅니다.
  • fps: 출력 영상의 프레임 속도를 25fps로 지정합니다.

注2:

-preset선택적 매개변수는 다음과 같습니다.

  • ultrafast - 인코딩 속도를 높이기 위해 비디오 품질을 희생하는 가장 빠른 사전 설정입니다.
  • superfast - 더 빠른 인코딩 속도가 필요하지만 약간의 품질 저하가 허용되는 상황을 위한 더 빠른 사전 설정입니다.
  • Veryfast - 더 빠른 인코딩 속도가 필요하지만 높은 비디오 품질을 유지해야 하는 상황을 위한 더 빠른 사전 설정입니다.
  • 더 빠르게 - 더 빠른 인코딩 속도가 필요하지만 높은 품질을 유지해야 하는 상황을 위한 빠른 사전 설정입니다.
  • fast - 좋은 비디오 품질을 유지해야 하지만 더 빠른 인코딩 속도가 필요한 상황을 위한 적당히 빠른 사전 설정입니다.
  • 중간 - 인코딩 속도와 비디오 품질의 균형을 맞추기 위한 기본 사전 설정입니다.
  • 느림 - 더 높은 비디오 품질이 필요하지만 더 느린 인코딩 속도가 허용되는 상황을 위한 더 느린 사전 설정입니다.
  • 더 느림 - 더 높은 비디오 품질이 필요하지만 더 느린 인코딩 속도가 필요할 때 사용되는 더 느린 사전 설정입니다.
  • Veryslow - 가장 높은 비디오 품질이 필요하지만 가장 느린 인코딩 속도가 허용될 때 사용되는 가장 느린 사전 설정입니다.

6. 부록: 목록 루프 스크립트, 데스크톱 라이브 스트리밍 스크립트

일부 응용 프로그램 시나리오에서는 루프에서 여러 홍보 비디오를 재생하거나 로컬 컴퓨터 데스크탑을 푸시하고 마이크를 사용하여 라이브 방송 등을 해야 합니다. 이 경우 powershell 스크립트를 작성하여 ffmpeg를 작동할 수 있습니다. 스크립트는 제공됩니다. 아래에:

1. 여러 동영상 반복(목록 루프)

# 设置视频文件夹路径
$folderPath = "D:\share\"

# 查找支持的视频文件格式
$supportedExtensions = ".mp4",".m4a",".3gp",".flv",".mov"

# 获取所有支持的视频文件
$videoFiles = Get-ChildItem -Path $folderPath -File | Where-Object {$_.Extension -in $supportedExtensions}

# 显示即将推流的文件列表
echo $videoFiles 

# 获取视频文件数量
$videoCount = $videoFiles.Count

# 判断视频文件数量
if ($videoCount -eq 1) {
  # 只有一个视频文件
  ffmpeg -re -stream_loop -1 -i $($videoFiles.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live
  
} elseif ($videoCount -ge 2) {
  # 有多个视频文件
  $currentIndex = 0
  do {
    $currentVideo = $videoFiles[$currentIndex]
    $nextIndex = ($currentIndex + 1) % $videoCount
    $nextVideo = $videoFiles[$nextIndex]

    ffmpeg -re -i $($currentVideo.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live

    # 计算下一个视频的索引
    $currentIndex = $nextIndex
  } while ($true)
}

위 스크립트를 .ps1 파일로 저장하고 마우스 오른쪽 버튼을 클릭한 후 "PowerShell로 실행"을 선택하여 대상 폴더에 있는 모든 비디오 파일의 루프 푸시 및 재생을 수행합니다. 이때 스트림을 가져오려면 VLC를 사용해야 합니다. 루프 모드를 설정하고(이전 단계 참조) 스크립트를 실행하기 전에 EasyDarwin을 실행해야 합니다. 비디오 소스 파일을 업데이트해야 하는 경우 비디오 파일을 D:\share\ 디렉터리에 넣고 스크립트를 닫은 후 다시 실행하세요.

2. 컴퓨터 데스크탑으로 스트리밍하고 컴퓨터 마이크를 사용하여 라이브 수업 및 기타 시나리오에 적합한 오디오를 입력합니다.

ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -vcodec libx264 -preset ultrafast -tune zerolatency -acodec aac -f rtsp rtsp://127.0.0.1:8554/live

그 중 audio="Microphone (Realtek High Definition Audio)"는 컴퓨터의 오디오 입력 장치 이름으로 바꿔야 합니다. 이름을 모르시면 이용하시면 됩니다.

ffmpeg -list_devices true -f dshow -i dummy

사용 가능한 모든 오디오 입력 장치를 나열합니다.

 

추천

출처blog.csdn.net/N71FS1/article/details/130019563