티스토리 뷰
2019/12/13 - [Tips] - EBS 라디오 녹음 프로젝트 (윈도우 편)
이 글은 Shell과 Unix 시스템의 이해를 높이기 위한 한 병편으로 기획된 것으로 EBS의 저작권 등을 침해하려는 의도는 없습니다. 관련 문제가 있을 경우 전자메일로 연락을 주시면 이 글을 삭제하도록 하겠습니다.
- 본 실습 내용을 macOS에서 제작된 것으로 파일 권한과 파일 경로 등의 문제에 신경을 쓴다면 큰 수정 없이 바로 적용할 수 있을 것입니다. 관련 문의는 댓글에 남겨 주시기 바랍니다.
예전엔 워크맨, 마이마이를 들고 음악을 듣고, FM 라디오를 녹음해 다시 듣곤 했다. 지금과 같이 방송사에서 '다시듣기'를 제공해 주지 않을 때였으니 재방을 기대할 수 없는 라디오 방송을 다시 듣고 싶다면 라디오 녹음을 필수였다. 주파수를 잘 맞추어 잡음을 없애고 제 시간에 카세트를 손에 들고 빨간 버튼에 손을 올려 놓고 있어야 했다. 그렇게 공을 들여 라디오 방송을 테이프에 녹음해서 친구들끼리 돌려 듣고 돌려 듣고 … 를 반복하다 테이프가 늘어나서 못쓰게 되는 경우도 있었다는 전설이 내려 온다.
"응답하라" 시리즈를 떠올리게 할 이야기로 서두를 꺼낸 것은 향수에 젖어 보자는 의도는 아니다. 지금은 라디오 방송도 FM인 아닌, 인터넷을 통해 청취할 수 있고 놓친 방송도 방송사의 다시듣기 기능을 활동해 언제든지 다시 들을 수 있다. 즉 지금은 인터넷 시대! 발품을 팔고 적절하게 비용을 지불할 용의만 있다면 정보나 콘텐츠는 없으니 앞의 이야기는 괜한 신파처럼 들린다. 그러나 늘 잡아주는 물고기만 먹어서는 사냥하는 법, 직접 문제를 해결할 수 있는 방법을 배울 기회는 사라지고 만다. 변화된 시대에 맞게 변화된 방법을 익혀 두는 노력도 잊지 말아야겠다.
이번 글에서는 인터넷상상의 오디오(또는 비디오) 자원을 저장하는 법과 이 작업이 반복될 때 Unix 시스템에서 반복. 처리하는 방법에 관해 알아볼 것이다. 간단히 말해서,
EBS 온에어 라디오 방송을 듣다가 녹음하고 싶은 방송이 생겼다. 해당 방송을 계속해서 녹음을 하고 싶은데 매번 해당 시간에 컴퓨터 앞에 앉아서 녹음 앱을 켰다가 끝날 때 끄는 게 귀찮아. 게다가 매번 그럴 시간적 여유도 내겐 없어. 어떻게 해야 해? 이럴 땐 남을 시켜야지. 그런데 남이 내 말을 잘 들어 줘? 그것도 공짜로? 아니지. 그러니 말 잘 듣는 컴퓨터에게 일을 시키는 수밖에 없잖아. 내가 원하는 일을 어떻게 컴퓨터에게 시킬 수 있을지 알아보자는 거야.
원하는 일련의 작업을 수행하기 위해서 알아야 할 관련 컴퓨팅 지식이 적지 않지만 본 글에서 직접적인 부분만 다루게 될 것이다. 주변 지식에 관해서는 추가되는 포스팅을 참고하기 바란다.
uri를 수집하자.
원하는 물건이 있다면 그 물건의 위치를 정확히 아는 것이 가장 먼저겠다. 인터넷상의 콘텐츠다 다르지 않다. 인터넷상의 모든 콘텐츠는 자신이 있는 위치, 즉 주소를 가지고 있다. 개별적인 주소를 가지고 있기 때문에 사람들이 해당 콘텐츠에 접속을 할 수 있는 것이며 관리도 가능한 것이다. 이 주소를 uri(Uniform Resource Identifier, 통합 자원 식별자)라고 한다. 따라서 EBS 라디오 방송을 녹음하고자 한다면 이 라디오 방송이 송출되는 위치를 알아야 첫 단추를 제대로 끼우게 된다.
EBS 홈페이지의 왼쪽 상단의 온에어를(아래 사진 참조) 클릭하면 모든 EBS 방송을 실시간으로 시청 및 청취할 수 있다.
여기에서 녹음하고 싶은 방송은 EBS FM 또는 외국어 라디오 채널이다. 이 라디오 채널의 uri를 어떻게 알아내느냐가 관건이다. 모든 해답은 문제 안에 있다고 했던가! 알고 싶은 uri 역시 문제의 장인 이 페이지 않에 있는 게 당연하다. uri가 명시되어 있지 않다면 어떻게 웹브라우저가 해당 자원(라디오 방송)을 찾아서 우리에게 들려 줄 수 있겠는가. 내게는 알겨주기 싫다고 하더라고 웹브라우저에 게는 자원의 위치를 공개해야 하는 것이다. 그러나 아무리 눈을 씻고 화면을 들여다 봐도 uri의 u자조차 찾을 수 없는 게 현실이다. 난 청맹과니인 것일까? 개안의 방법은 관련 포스팅을 참고하기 바란다.
여기서 좌절하지 말자. 문제를 직접 해결할 수 없다고 하더라도 우리에게는 구글신이 옆에 있지 않은가! 구글 검색을 통해 의외로 간단히 우리가 원하는 uri 정보를 찾을 수 있다. 이렇게라도 문제를 해결해야 다음 단계로 넘어갈 수 있다.
검색을 통해 찾을 수 있는 EBS 라디오 uri는 아래와 같았다.
EBS FM: http://new_iradio.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8
EBS 외국어 채널: http://bandibook.ebs.co.kr/bandibook/live_m4a/playlist.m3u8
EBS 라디오 방송의 uri는 언제든지 바뀔 수 있으므로 현재(November 29, 2019)까지 유효한 주소일 뿐임을 양해바란다. 근본적인 해결은 사이트 내에서 uri를 찾아낼 수 있는 방법을 습득하는 것이다. 언제까지 누군가의 호의만을 기대하고 있을 수 없다.
셸 스크립트(shell script) 프로그래밍: m3e8 형식의 라디오 파일 녹음하기
자워의 위치를 알아냈으니 이제 1/3은 온 거나 다름없다. 이제 이 uri를 이용하여 음성 파일을 내 컴퓨터에 저장하는 shell script를 짜야 한다. 간단하게 말해서 프로그래밍을 하는 단계이다. 다른 다른 언어로 프로그램을 할 수 있지만 이 글에서는 셸을 이용한다. 셸(shell)은 운영체제(정확히는 커널)과 사용자 사이를 이어주는 역할을 하는 시스템 프로그램이다. 커널(kenal)이란 운영체제의 일부로서 컴퓨터의 메모리에 항상 떠있는 하나의 프로그램이다. 셸은 사용자의 지시(명령어)를 해석하고 운영체제가 알아들을 수 있게 지시해 준다. 다시 운영체제는 셸에게서 받은 지시를 해석하여 하드웨어를 위한 지시어로 바꾸어 주는 것이다. 이 셸은 Unix 시스템을 사용할 때 기본적으로 숙지하고 있어야 할 부분이다. 비록 GUI로 맥이나 리눅스를 사용하고 있는 사용자라도 셸을 익히면 많은 이로움이 있을 것이니 가시밭길을 두려워 말아야겠다.
아래는 셸의 하나인 bash를 사용한 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/bin/bash --login
# crontab에 등록할 shell script라면 위 라인을 잊지 말자.
RADIO_ADDR="http://new_iradio.ebs.co.kr/iradio/iradiolive_m4a/playlist.m3u8"
PROGRAM_NAME=$1
RECORD_MINS=$(($2 * 60))
DEST_DIR=$3
REC_DATE=`date +%Y%m%d-%H%M`
MP3_FILE_NAME=$PROGRAM_NAME"_"$REC_DATE.mp3
ffmpeg -t $RECORD_MINS -y -i $RADIO_ADDR $MP3_FILE_NAME &>/dev/null
mkdir -p $DEST_DIR
mv $MP3_FILE_NAME $DEST_DIR
|
cs |
이 셸스크립트를 실행하는 데는 3개의 인자가 필요하다. 첫 번째 인자는 녹음 파일명, 두 번째 인자는 녹음 시간(분 단위), 세 번째 인자는 저장 위치를 지정하는 것이다. 이 셸스크립트를 ebs_recoding.sh
로 저장한다.
1
2
|
./ebs_recoding.sh EBS_PowerEng 20 /Users/editor752/EBS/EBS_PowerEng
|
cs |
이 셸스크립트가 정상적으로 동작을 하면 아래와 같은 파일명의 오디오 파일이 지정한 폴더(/Users/editor752/EBS/EBS_PowerEng)에 생성된다.
EBS_PowerEng_20191129-1400.mp3
첫 번째 인자에 의해 EBS_PowerEng
가 지정되었고 뒤 부분은 녹음된 날짜(20191129)와 녹음 시간(1400)이 덧붙어 파일명이 완성된 것이다.
그 후에 모든 사용자가 이 셸스크립트를 사용할 수 있도록 파일 권한을 설정해 주어야 한다. 이 셸스트립트를 crontab에 등록하여 실행할 텐데 파일 실행 권한 오류가 발생하지 않도록 모든 사용자들에게 파일에 관한 모든 권한을 주는 것이다. 파일 권한을 변경하기 위해서는 아래와 같이 chmod
를 사용한다.
1
|
chmod 777 ebs_recoding.sh
|
cs |
다음 장인 crontab과 관련해서 가장 유념해야 할 부분은 1라인이다. 각주로도 남겨두었듯이 이 라인이 없으면 아무리 crontab에 이 셸스크립트를 등록해도 원하는 결과를 얻을 수 없다. crontab을 다루면서 관련 내용을 자세히 설명하겠다.
작업 자동화: 크론탭(crontab)에 반복 작업 등록
윈도우의 작업 스케줄러와 같은 기능을 하는 유닉스 프로그램이 바로 크론(cron)이며 이 크론에 예약 작업을 등록하는 곳이 크론탭이다. 작업을 등록하기 위해서는 정확하게 기술 방식을 준수하여야 한다. 터미널에 crontab -e
를 입력하고 엔트를 치면 시스템의 기본 편집기 crontab.~(임의 문자열)
파일이 열린다. 이미 등록한 작업이 있다면 해당 내용을 확인, 편집할 수 있으면 처음이라면 빈 문서이겠다.
1
2
|
crontab -e
|
cs |
이 파일에 아래의 내용을 입력한 후 저장한다.
1
2
3
|
# 초급 일본어
10 5 * * 1-3 /Users/editor752/EBS/ebs1_recoding.sh EBS_BeginnerJap 20 /Users/editor752/EBS/EBS_BeginnerJap >> /Users/editor752/EBS/EBSRecoding_cron.log 2>&1
|
cs |
이 문서는 크게 3 부분으로 나뉜다.
-
첫 번째 부분은 작업을 실행할 일정을 지정한다.
10 5 * * 1-3
-
두 번째 부분 실행할 작업, 즉 실행할 프로그램과 그 인자를 명시한다.
/Users/editor752/EBS/ebs_recoding.sh EBS_BeginnerJap 20 /Users/editor752/EBS/EBS_BeginnerJap
실행할 셸스크립트(ebs_recoding.sh)와 그 절대경로(/Users/editor752/EBS/)를 적어 준다. cron의 실행 방식상 절대경로를 사용하는 것이 안전하다. 그리고 셸스크립트를 실행할 때 필요한 인자 3개(EBS_BeginnerJap 20 /Users/editor752/EBS/EBS_BeginnerJap)가 명시되어 있다.
일반적으로는 이 두 부분만 있어도 크론을 실행할 수 있다. 마지막 부분은 클
-
세 번째 부분은 에러 처리를 위한 로그 파일을 지정한 것이다.
>> /Users/editor752/EBS/EBSRecoding_cron.log 2>&1
리다이렉트를 이용해 로그 기록을 지정한 파일(EBSRecoding_cron.log)에 저장하도록 하였다.
이러한 패턴을 이용해 원하는 다른 방송 녹음도 지정할 수 있다.
여기까지 무사히(?) 따라왔다면 이제 지정한 시간에 라디오 녹음이 정상적으로 되는지 확인하는 것만 남는다.
'Tips' 카테고리의 다른 글
[윈도우] 스크린샷 찍기 (0) | 2019.12.10 |
---|---|
새소식: 드디어 <티스토리> 앱이 개편되었다 (0) | 2019.12.10 |
카탈리나 정식 배포와 페이퍼스 3(Paper3 in the Catalina) (0) | 2019.11.10 |
코드 하이라이팅 방법: 기본모드의 코드 삽입과 color Scripter, hilitme (0) | 2019.11.01 |
티스토리(Tistory)에서 지원하는 마크다운(MarkDown) 문법 (0) | 2019.11.01 |
- Total
- Today
- Yesterday
- baekjoon
- setText()
- 소수
- python3
- QGridLayout
- tips
- judge
- Mac
- 리규찬
- books
- MacOS
- Tistory
- 리찬규
- Python
- NK
- QLineEdit
- 북한말
- BOJ
- words
- 어원
- django
- 백준
- C
- word
- locallibrary
- QtDesigner
- 유래
- QComboBox
- QLabel
- PyQt5
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |