본문 바로가기

인터넷

ffmpeg - Error during demuxing: Input/output error

반응형

ffmpeg 으로 인터넷 자료를 실시간으로 저장하다 보면 다음과 같은 오류가 발생하는 경우가 있습니다.

[in#0/hls @ 0xc68017dbe420] Error during demuxing: Input/output error

 

네트워크 안정성이나 기타의 이유로 데이터가 들어오지 않아 발생하는 오류 같습니다.

 

이럴때는 다음과 같이 파라미터를 설정해서 녹음하면 끊기지 않습니다.

다시 파라미터를 아래와 같이 설정해서 녹음해 봅니다.

 

ffmpeg -y -re -i "https://2fm-ad.gscdn.kbs.co.kr/2fm_ad_192_1.m3u8" -vn -acodec copy -loglevel repeat+level+trace -protocol_whitelist file,http,https,tcp,tls -segment_list_flags +live -http_persistent 1 -reconnect_streamed 1 -reconnect_delay_max 30 -reconnect_on_network_error 1 -reconnect_at_eof 1 -rw_timeout 120000000 -buffer_size 32768k -hls_init_time 4 -hls_flags delete_segments+append_list -hls_time 10 -hls_list_size 6 -t 4200 test.aac

 

사용하는 파라미터는 다음과 같습니다.

-y :  출력 파일 덮어쓰기

-re : 입력을 실시간 속도로 읽도록 FFmpeg에 지시합니다. 이는 스트리밍 시나리오를 시뮬레이션하는 데 유용합니다.

이 옵션이 유용한 이유입니다:
버퍼 오버플로우 방지: -re 옵션은 입력 데이터를 실시간 속도로 처리하므로, 버퍼 오버플로우로 인한 demuxing 오류를 줄일 수 있습니다.
네트워크 부하 감소: 실시간 속도로 데이터를 처리함으로써 네트워크 부하가 줄어들어 연결 안정성이 향상될 수 있습니다.
서버 부하 감소: 스트리밍 서버의 부하를 줄여 더 안정적인 스트림 제공이 가능해집니다.
타이밍 개선: 실시간 처리는 오디오와 비디오 스트림 간의 타이밍 문제를 줄일 수 있습니다.

-vn : 비디오 사용하지 않음

-acode : 오디오 코덱 그대로 사용

-hide_banner : FFmpeg 정보 숨기기

-loglevel repeat+level+trace : 로그 정보 수준 (로그 반복, level 추가, trace 로그)

-protocol_whitelist file,http,https,tcp,tls : https 연결

-segment_list_flags +live : HLS live 연결

-http_persistent 1 : 지속적인 HTTP 연결을 사용하십시오. HTTP 출력에만 적용됩니다.

-reconnect_streamed 1 : 오류가 발생했을 때, 스트리밍되거나 탐색할 수 없는 스트림을 재연결할 수 있게 합니다

-reconnect_delay_max 30 : 재연결시 최대 딜레이 초

-reconnect_on_network_error 1 : TCP/TLS 오류시 자동으로 재연결합니다.

-reconnect_at_eof 1 : 이 설정을 적용하면 EOF가 오류로 처리되어 재연결합니다. 라이브/무한 스트리밍에 유용합니다.

-rw_timeout 120000000 : 읽기/쓰기 완료를 기다리는 최대 시간입니다. 단위는 microsecond 입니다. 120초입니다.

-buffer_size 32768k : 데이터 재전송을 위한 내부 RIST 버퍼 크기를 밀리초 단위로 설정합니다. 기본값은 0으로 librist 기본값(1초)을 의미합니다. 최대값은 30초입니다.

-hls_init_time 4 : 초기 대상 세그먼트 길이를 초 단위로 설정합니다.기본값은 0입니다.첫 번째 m3u8 목록에서 이 시간이 지나면 다음 키 프레임에서 세그먼트가 잘립니다.초기 재생 목록이 채워지면 ffmpeg는 hls_time과 동일한 기간에 세그먼트를 자릅니다.

-hls_flags delete_segments+append_list : 

-hls_time 10 : 대상 세그먼트 길이를 초 단위로 설정합니다.기본값은 2입니다.이 시간이 지나면 다음 키 프레임에서 세그먼트가 잘립니다.

-hls_list_size 6 : 최대 재생 목록 항목 수를 설정합니다.0으로 설정하면 목록 파일에 모든 세그먼트가 포함됩니다.기본값은 5입니다.
참고. hls_list_size 0을 사용하여 재생 목록의 모든 세그먼트를 유지합니다.0보다 큰 값을 사용하면 재생 목록이 hls_list_size 길이의 슬라이딩 창을 사용합니다.또한 -hls_time 1을 사용하면 재생 목록 파일 크기가 크게 늘어납니다.Apple 권장 값은 10초이므로 원하는 키 프레임 간격의 배수로 늘려야합니다.

-t 4200 : 4200초 동안 저장

 

추가로 녹음하는 스크립트 입니다.

#!/bin/bash

# 중단 시 처리할 함수 정의
cleanup() {
    echo "스크립트가 중단되었습니다. 파일 이동을 건너뜁니다."
    kill $FFMPEG_PID
    rm -f "$FILENAME"
    exit 1
}

# SIGINT 시그널(Ctrl+C)에 대한 처리 설정
trap cleanup SIGINT

# get service url
SERVICE_URL=$(curl "https://cfpwwwapi.kbs.co.kr/api/v1/landing/live/channel_code/25" | jq -r '.channel_item[] | select(.media_type == "radio") | .service_url')

DATE=$(date +"%Y-%m-%d")
FILENAME="GMP-$DATE.aac"

# ffmpeg 명령어 구성
FFMPEG_CMD="ffmpeg -y -re -i \"$SERVICE_URL\" -vn -acodec copy -loglevel repeat+level+trace -protocol_whitelist file,http,https,tcp,tls -segment_list_flags +live -http_persistent 1 -reconnect_streamed 1 -reconnect_delay_max 30 -reconnect_on_network_error 1 -reconnect_at_eof 1 -rw_timeout 120000000 -buffer_size 32768k -hls_init_time 4 -hls_flags delete_segments+append_list -hls_time 10 -hls_list_size 6 -t 4200 \"$FILENAME\""

# 명령어 실행 및 실시간 로그 모니터링
eval "$FFMPEG_CMD" 2>&1 | tee ffmpeg_output.log | while read line; do
    echo "$line"
    if [[ "$line" == *"Error during demuxing: Input/output error"* ]]; then
        echo "오류 발생: Error during demuxing: Input/output error"
        kill $!
        rm -f "$FILENAME"
        exit 1
    fi
done &

FFMPEG_PID=$!
wait $FFMPEG_PID

# ffmpeg 명령어의 종료 상태 확인
if [ $? -eq 0 ]; then
    echo "녹음이 성공적으로 완료되었습니다. 파일을 이동합니다."
    mv "$FILENAME" ~/GMP/
else
    echo "녹음이 비정상적으로 종료되었습니다. 파일 이동을 건너뜁니다."
    rm -f "$FILENAME"
fi

rm -f ffmpeg_output.log

 

반응형