며칠 전, 갑자기, 그야말로 갑자기 EBS 라디오 언어 강좌를 들어야겠다는 욕구가 솟구쳤다. 그 전에 뭐를 하고 있었는지는 기억이 나지 않는데, 불현듯, 또 이런 나쁜(?) 버릇이 튀어와버렸다.
** 나쁜 이유는.. 그저 사기만 하고, 이 글에서 얘기할 내용처럼, 잔뜩 자료만 모아두고 정작 공부는 하지 않기 때문이지.
찾아보니, 지난 번에 들었던 때는 2014년이고, 당시에도 열심히 녹음을 했더랬다. 그 자료가 고스란히 남아있음을, 무려 6년 만에 확인할 수 있었다.
2014년 당시엔, 소니 워크맨을 통해 FM 라디오 방송을 녹음했었다. 아마도, 알람을 설정해놓고, 수동으로 방송 시간에 맞춰 녹음 버튼을 눌렀더랬다.
사실, 이번에도 그렇게 하려고 준비를 했다. 서랍 속에 박혀있던 기기를 다시 꺼내고, 새롭게 충전도 빵빵하게 해놓고..
그러다가, 이번엔 안드로이드 기기로 녹음을 해볼까? 하는 생각을 했고, 그에 따른 검색을 하기 시작했다.
헌데.. 세상은 그 사이 많이 바뀌어 있었다.
여기에 쓰인 소스는, 인터넷에서 돌아다는 것을 주워왔기 때문에, 출처를 밝히기가 쉽질 않다. 혹, 누군가 보시고 문제가 있음을 지적하신다면, 소스는 공개하지 않기로 하겠다.
이 프로그램은 두가지가 협력하여 작동한다. 하나는 원하는 시간에 프로그램을 실행시켜주는 Cronjob(Crontab), 그리고 인터넷 라디오 주소로 접속하여 사운드 파일을 받아 복사해주는 ffmpeg 가 또 다른 하나다.
먼저 녹음파일을 생성하는 ffmpeg 를 위한 스크립트를 보자.
이 스크립트는 총 3개의 arguments 를 받는다.
- 첫번째 : 프로그램명. (프로그램명과 동일한 디렉토리가 미리 있어야 한다.)
- 두번째 : 프로그램의 길이. 분(分) 단위로.
- 세번째 : EBS 반디는 하루에 2회 재방을 하는데, 첫번째 재방과 두번째 재방을 구분하기 위해 넣어줬다. 없어도 상관없다.
#!/bin/sh # 실행형식 # ebs_record.sh 'Power English' 20 # ebs_record.sh '초급 일본어' 20 # $1 은 'Power English' 또는 '초급 일본어' # 대소문자 구분해야함. PROGRAM_NAME=$1 # $2 로 몇분 녹음할 지 결정. 1분 일찍 시작(크론에서, 원래 시각보다 1분 일찍 설정)하고, 1분 늦게 끝나게. # 20/60 등 분으로 지정. # -t 형식은 초 또는 00:00:00 RECORD_SECS="$(($2*60+120))" # Power English 는 매일(월-토) 15:40, 22:40 2회 방송되는데, 15:40에 놓쳤을 가능성도 있으므로 # 밤에 한번 더 하기로 한다. (초급 일본어도 마찬가지.) # 이를 위해 $3 으로 구분하기로 한다. # 값은 1 또는 2. DEST_DIR_PARENT="/강좌/EBS" DEST_DIR="$DEST_DIR_PARENT/$1/$(date +%Y%m)" # 디렉토리가 없으면 만들기. (매월 새로운 달에 들어가면 만들도록) if [ ! -d "$DEST_DIR" ] then mkdir "$DEST_DIR" fi # ~2022.09 까지. #RADIO_ADDR="rtsp://new_iradio.ebs.co.kr:554/iradio/iradiolive_m4a" # 2020.10 ~ RADIO_ADDR="https://ebsonair.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8" TITLE=$PROGRAM_NAME$(date "+ %Y.%_m.%_d.") TEMP_AAC=/tmp/$(date +%H%M%S%N).m4a if [ -z "$3" ] then FINAL_AAC=$PROGRAM_NAME$(date +_%y%m%d).m4a else FINAL_AAC=$PROGRAM_NAME$(date +_%y%m%d)-$3.m4a fi echo "$1 : 녹음 날짜 $(date)" >> ~/record.log # 예전 rtsp 방식 #ffmpeg -rtsp_transport tcp -i $RADIO_ADDR -t $RECORD_SECS -codec:a copy -vn -metadata title="$TITLE" -metadata date=$(date +%F) $TEMP_AAC # 현재 http 방식 ffmpeg -i $RADIO_ADDR -t $RECORD_SECS -codec:a copy -vn -metadata title="$TITLE" -metadata date=$(date +%F) $TEMP_AAC mv $TEMP_AAC "$DEST_DIR/$FINAL_AAC"
조금 더 가다듬을 필요는 있지만, 이 정도로도 큰 무리는 없다.
다음은 크론탭.
개인 계정으로 작성한다.
# EBS 녹음 # Power English : 방송은 15:40, 22:40 하루 2회. # 첫번째 시간에 서버가 꺼져있을 경우를 대비하여 2회 모두 녹음하기로 설정. # 시간은 시작시간 보다 1분 빨리, 1분 늦게까지. (월-토) 39 15 * * 1-6 /home/nemostep/bin/ebs_record.sh "Power English" 20 1 39 22 * * 1-6 /home/nemostep/bin/ebs_record.sh "Power English" 20 2 # 일요일.. 종합 2시간. 59 14 * * Sun /home/nemostep/bin/ebs_record.sh "Power English" 120 # 초급 일본어(월-수) 09 17 * * 1-3 /home/nemostep/bin/ebs_record.sh "초급 일본어" 20 1 39 23 * * 1-3 /home/nemostep/bin/ebs_record.sh "초급 일본어" 20 2 # 일요일.. 종합 1시간 59 07 * * Sun /home/nemostep/bin/ebs_record.sh "초급 일본어" 60
이제 막 시작했으니, 잘 돌아갈 지는 일주일은 지나봐야 알 수 있겠지.
문제는, 서버가 24시간 켜있는게 아니기에, 그래서 2회 녹음하는 방식을 택하긴 했지만.
EBS 반디 라디오 주소/스트리밍 방식이 가끔씩 바뀌는 모양이다. 기존에 사용하던 방식은 22년 9월까지 유효했고, 10월부터는 새 주소로 변경되었다. 그럼 새 주소는 어떻게??
EBS 반디로 가서, 소스를 열고 주소를 찾아보면 된다. 소스엔 이런 코드가 포함돼 있는데..
var source = { tv : { pc : "https://ebsonair.ebs.co.kr/groundwavefamilypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/groundwavetablet500k/tablet500k/playlist.m3u", android : "https://ebsonairios.ebs.co.kr/groundwavetablet500k/tablet500k/playlist.m3u" }, tv2 : { pc : "https://ebsonair.ebs.co.kr/ebs2familypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/ebs2tablet500k/tablet500k/playlist.m3u8", android : "https://ebsonairios.ebs.co.kr/ebs2tablet500k/tablet500k/playlist.m3u8" }, ebsu : { pc : "https://ebsonair.ebs.co.kr/ebsufamilypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/ebsutablet500k/tablet500k/playlist.m3u8", android : "https://ebsonairios.ebs.co.kr/ebsutablet500k/tablet500k/playlist.m3u8" }, plus1 : { pc : "https://ebsonair.ebs.co.kr/plus1familypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/plus1tablet500k/tablet500k/playlist.m3u8", android : "https://ebsonairios.ebs.co.kr/plus1tablet500k/tablet500k/playlist.m3u8" }, plus2 : { pc : "https://ebsonair.ebs.co.kr/plus2familypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/plus2tablet500k/tablet500k/playlist.m3u8", android : "https://ebsonairios.ebs.co.kr/plus2tablet500k/tablet500k/playlist.m3u8" }, ebse : { pc : "https://ebsonair.ebs.co.kr/plus3familypc/familypc1m/playlist.m3u8", ios : "https://ebsonairios.ebs.co.kr/plus3tablet500k/tablet500k/playlist.m3u8", android : "https://ebsonairios.ebs.co.kr/plus3tablet500k/tablet500k/playlist.m3u8" }, radio : { pc : "https://ebsonair.ebs.co.kr/fmradiofamilypc/familypc1m/playlist.m3u8", ios : "https://ebsonair.ebs.co.kr/fmradiotablet500k/tablet500k/playlist.m3u8", android : "https://ebsonair.ebs.co.kr/fmradiotablet500k/tablet500k/playlist.m3u8" }, iradio : { pc : "https://ebsonair.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8", ios : "https://ebsonair.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8", android : "https://ebsonair.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8" }
iradio 주소를 적절히 택해주면 되겠다.