영상 사이에 재연결하지 않는 24/7 스트림: 파이프를 통해 공급되는 하나의 ffmpeg

영상

완성된 영상을 24시간 내내 재생하는 라이브 채널에는 두 가지 간단한 설계가 있으며, 둘 다 무언가를 놓칩니다. 영상마다 ffmpeg을 재시작하면 전환 시마다 RTMP 연결이 끊깁니다. concat 재생 목록은 시작 시 한 번만 읽히므로, 새 영상은 다음 재시작까지 기다려야 합니다.

설계

각 영상은 스트림의 해상도와 프레임 레이트로 MPEG-TS로 한 번 변환됩니다. 세로형 영상은 검은 여백 대신 흐리게 처리된 자기 자신의 복사본 위에 배치됩니다. 하나의 ffmpeg 프로세스가 표준 입력에서 MPEG-TS를 읽고 라이브 인제스트가 기대하는 대로 2초마다 키프레임이 포함된 고정 비트레이트로 인코딩합니다. 작은 피더가 준비된 파일들을 실시간 속도로 해당 파이프에 하나씩 순차적으로 기록하며, 전환 시마다 다음 파일을 선택합니다. 처음 재생되지 않은 영상부터, 그다음 가장 오래전에 재생된 영상을 선택합니다. ffmpeg의 MPEG-TS 리더는 각 파일의 타임스탬프가 다시 시작되는 것을 감지하고 이를 조정하므로, 출력은 끊김 없이 계속됩니다.

세부 사항 1: 첫 바이트부터 시작하는 속도

첫 번째 버전은 ffmpeg이 시작될 때 타이머를 시작했습니다. 첫 번째 파일 준비에 9초가 걸렸으므로, 피더는 9초 늦었다고 판단하여 모든 파일을 한꺼번에 보냈습니다. 타이머를 첫 바이트가 기록될 때 시작하도록 수정했습니다. 53초간 실행하면 53초 분량의 스트림이 생성되었습니다.

세부 사항 2: 이음새의 오디오

전환 시 다음 파일의 오디오가 이전 파일의 오디오가 끝나기 17밀리초 전에 시작되었습니다. 인코더는 입력이 "시간상 역주행"한다고 경고했고, 믹서는 타임스탬프를 수정했습니다. aresample=async=1:min_hard_comp=0.01:first_pts=0으로 리샘플링하면 인코더가 보기 전에 이러한 겹침 부분을 잘라내거나 패딩 처리합니다. 5번의 전환이 포함된 1분 남짓의 실행에서 수신된 스트림의 모든 오디오 및 비디오 타임스탬프가 증가했으며, 스트림은 오류 없이 디코딩되었습니다.

세부 사항 3: 일부 경고는 정상입니다

각 파일은 MPEG-TS 카운터와 타이머를 다시 시작하므로, ffmpeg은 전환 시마다 "Packet corrupt"와 "timestamp discontinuity"를 보고합니다. 이러한 메시지는 예상되는 것이며, 실제 오류가 눈에 띄도록 로그에서 제외합니다.

워치독

ffmpeg가 종료되거나 진행 상황이 1분 동안 멈추면 스트림이 점점 길어지는 대기 시간을 두고 재시작되며, 반복 실패 시 메시지를 전송합니다. 테스트에서는 인코더를 수동으로 종료했습니다. 7초 후 스트림이 다시 연결되었고, 실행 중 추가된 영상은 재접속 없이 로테이션에 합류했습니다. 재시작은 짧은 재접속이므로 YouTube 브로드캐스트가 자동으로 시작되고 자동으로 중지되지 않도록 설정하세요. 모든 로그 라인에서 스트림 키는 마스킹 처리되며, ffmpeg 자체 로그도 포함됩니다. Studio는 이 라이브 채널을 systemd 서비스로 제공합니다.

업데이트됨: