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
'인터넷' 카테고리의 다른 글
카카오맵 여러개 위치 표시 (2) | 2020.06.08 |
---|---|
카카오 맵을 이용한 주소를 위도 경도로 변경하는 방법 (0) | 2020.06.08 |
RT-AC68u 관련 Command Line 명령어들 (0) | 2020.04.24 |
KT LTE 데이터 무제한 (0) | 2014.08.31 |
카카오톡 이모티콘 새로 받기 (0) | 2014.03.13 |