사용자 도구

사이트 도구


project:unattendedradiorecorder

무인 라디오 녹음기 만들기

저는 라디오를 많이 청취합니다. 특정 채널을 거의 고정하고 계속 듣는 편이에요. FM 튜너를 그대로 이용하기도 하지만 요즘은 인터넷 라디오도 많이 이용합니다. 지하철 같은 전파가 닫지 않는 곳에서도 들을 수 있는데다가, 주파수에 의해 이동할 때 생기는 잡음에 있어서도 자유롭죠. 물론 버퍼링과 약간 애매한 음질은 조금 감안해야 할 단점이긴 합니다.

이렇게 자주 듣다 보니 좋아하는 라디오 코너 몇개가 있기 마련입니다. 팟캐스트 같은 걸로 다시 듣기가 잘 마련되어 있긴 한데, 저작권 때문에 노래는 초반 10초 정도만 나오고, 노래의 나머지는 잘린다는 게 항상 아쉬웠습니다.

문득 카세트 레코더를 쓰던 시절의 라디오를 생각해 봤습니다. 그 때는 데크에 카세트를 넣어두고 언제 좋아하는 음악이 나오나, 1초라도 놓칠세라 녹음 버튼에 손가락을 올려두고 대기 상태로 음악 프로그램을 듣곤 했습니다. 일요일 정오에 하는 가요 인기 차트 소개 프로그램은 가장 좋은 소스였어요. 하지만 시간이 모자라 노래가 잘리거나 DJ의 멘트가 노래에 깔릴 때면 그게 얼마나 야속하고 아쉽던지요.

라디오도 발전한 만큼, 라디오 녹음의 스킬도 발전할 수 있다고 생각합니다. 보다 편리하고 쉽게 녹음을 하면 어떨까 상상해 봤습니다. DVD나 CD도 영상과 음원을 추출해서 별도의 파일로 압축해서 듣고 하잖아요? 티브이도 예약 녹화는 카세트 시절부터 있고, 요즘은 하드디스크에 기록하기도 하구요.

요즘은 소규모 NAS도 많이 사용됩니다. 24시간 운용하면서 간단하게 웹 서버, 토렌트, 파일 서버로 활용하는데, 이 자원을 보다 잘 활용하면 좋아하는 라디오 프로그램도 놓치지 않을 수 있을 것 같습니다.

몇 년 전 네이버 웹툰 저장하기 문서를 공개할 때부터 많이 염려하는 사항입니다. 저는 불법 복제나 무단 배포에 대해서는 절대 반대합니다. 이 문서는 결국 어줍짢은 지식을 기록한 것에 불과합니다. 이를 악용하여 여럿에게 폐를 끼칠 만한 행위는 절대 하지 마세요. 저는 경고했습니다. 녹음을 했으면 개인적으로 조용히 듣고, 필요가 없어지면 삭제하세요. 녹음된 파일은 절대 함부로 배포하지 마시기 바랍니다.

녹음 방법 소개

라디오 녹음은 인터넷 라디오 녹음을 대상으로 할 것입니다. 인터넷 라디오를 사용하는 주된 이유는 균일한 음질을 쉽게 확보할 수 있다는 점입니다. 국내에서는 이제 더이상 구하기 어렵지만 해외 쇼핑몰을 검색하면 아직도 USB 방식의 FM 튜너를 그다지 비싸지 않은 가격에 구할 수 있습니다. 한 10년 전쯤은 FM 튜너만 있는 제품도 있었지만, 지금은 요즘은 FM 튜너 모듈만 있는 경우는 잘 없는듯 합니다. 해당 기기가 리눅스에서도 잘 인식된다면 인터넷이 아닌 공중파를 직접 수신해서 녹음을 할 수도 있겠죠. 하지만 인터넷 라디오가 워낙 손쉽게 구해질 수도 있고, 음질도 납득할 만한 수준인지라 굳이 튜너까지 써야 할 필요를 못 느끼네요.

URL 캐기

FM 튜너를 쓰는 것이 아니라면 해당 방송의 URL을 수집하는 것이 가장 먼저입니다. 가장 쉽고 빠른 방법은 역시 ;-) 구글 검색입니다. 비슷한 주제로 삽질을 하신 분들이 이미 많죠. 블로그 등등을 잘 검색해 보면 mms 주소를 게시한 것을 볼 수 있습니다. 오래된 정보라면 주소가 더 이상 유효하지 않을 수도 있지만, 때때로 살아 있는 것도 있습니다. 다만 주의해야 할 점이 있습니다. 몇몇 주소는 지방의 라디오 방송 주소라서 원하는 프로그램이 방송되지 않을 수도 있습니다.

URL 캐는 방법은 정해진 것이 없습니다. 이 부분은 각자의 실력(?)에 맡기도록 하겠습니다. 단, 제가 즐겨 듣는 MBC의 라디오 URL을 얻는 방법을 참고로 공개하도록 하겠습니다.

2016년 11월 기준, MBC 라디오 실시간 청취 페이지는 아래 그림과 같습니다.

스마트폰이 이렇게 대중화되기 전에도 MBC는 실시간 라디오 청취 서비스를 제공했었습니다. 그러나 그 당시는 고약하게도 ActiveX를 사용했기 때문에 라디오를 녹음하는 일은 생각보다 쉽지 않았습니다. 그러나 이제는 어떤 웹브라우저에서도 재생되도록 수정되었죠. 윈도우뿐만 아니라 스마트폰이나 맥OS에서도 전용 라디오 앱을 제공하기도 하구요. 그 덕에 URL을 캐는 일도 어렵지 않게 되었습니다.

파이썬을 이용해서 간단하게 URL을 추출할 수 있습니다.

imbc_py2.py
#!/usr/bin/env python2
import json
import urllib2
print(json.loads(urllib2.urlopen('http://miniplay.imbc.com/WebLiveURL.ashx?channel=mfm&agent=&protocol=RTMP').read()[1:-2])['AACLiveURL'])

위 스크립트는 파이썬 2를 사용한 것입니다. 파이썬 3를 사용하려면 다음처럼 바꾸면 됩니다.

imbc_py3.py
#!/usr/bin/env python3
import json
from urllib.request import urlopen
print(json.loads(urlopen('http://miniplay.imbc.com/WebLiveURL.ashx?channel=mfm&agent=&protocol=RTMP').read().decode('utf-8')[1:-2])['AACLiveURL'])

파라미터 부분에 channel=mfm 부분이 있는데 이 값을 바꾸면 채널이 변경됩니다.

  • mfm: MBC FM4U (서울 기준 91.9Mhz)
  • sfm: MBC 표준 FM (서울 기준 95.9Mhz)
  • chm: Channel M (인터넷 라디오 전용)

이 스크립트의 실행 결과로 “rtmp://“로 시작하는 주소를 얻을 수 있습니다. 이것을 RTMP 프로토콜을 지원하는 재생기에 넣으면 됩니다. 윈도우에서는 팟플레이어가 재생을 지원하고, VLC나 Mplayer는 당연히 지원합니다.

보너스: VLC, mplayer로 라디오 듣기

mplayer 같은 커맨드 라인을 지원하는 재생기를 쓰면 아주 쉽고 간단하게 라디오를 들을 수 있는 명령어를 뚝딱 만들 수 있습니다. 위 파이썬 코드에 실행 권한을 준 상태에서 다음과 같은 쉘 스크립트를 작성합니다. 백그라운드에서 mplayer가 실행되며, 동시에 홈 디렉토리에 imbc.pid라는 mplayer의 프로세스 아이디를 가진 파일을 생성합니다.

imbc.sh
#!/bin/bash
((mplayer "`~/imbc_py2.py`")& echo $! > ~/imbc.pid &)

재생 명령을 만들었으니, 중지 명령도 만듭니다.

imbc_stop.sh
#!/bin/bash
kill `cat ~/imbc.pid`
rm ~/imbc.pid

덤프

인터넷 라디오도 납득할 만한 수준의 음질이라고 말했지만, 사실 그럭저럭인 음질입니다. 음질에 민감하신 분들은 인정하지 못할 수도 있을 수도 있습니다. 녹음된 것을 다시 트랜스코딩할 때 꼼꼼하게 하지 않으면 음질이 쉽게 뭉개질 우려가 큽니다. 그렇다고 원래의 비트레이트보다 더 높게 주면 용량의 낭비가 있을 것이고, 그래서 별다른 수가 없는 한 주어지는 스트림을 그대로 파일로 저장하는 방법을 선택합니다.

덤프는 전적으로 mplayer의 능력에 맡깁니다. 재생을 할 때 사용한 명령어에 몇 가지 스위치만 좀 더 주면 됩니다.

record_imbc
#!/bin/bash
((mplayer "`~/imbc_py2.py`" -cache 8192 -dumpstream -dumpfile "imbc-`date +%Y%m%d%H%M%S`.m4a" > /dev/null 2>&1)& echo $! > ~/imbc_rec.pid &)

쉽죠? 현재 실행 중인 디렉토리에 “imbc-연월일시분초.m4a”식으로 파일이 저장됩니다.

종료

mplayer를 백그라운드에 실행시키고 imbc_rec.pid 파일을 만들었습니다. 지정한 시간 이후에 이 파일을 이용해 mplayer를 종료하면 되겠죠. 종료 후에는 더 의미가 없으니 이 파일을 삭제합니다.

코드를 다음처럼 하나 더 만들면 되겠네요.

record_imbc_10s
~/record_imbc
sleep 10s
kill `cat ~/imbc_rec.pid`
rm -f ~/imbc_rec.id

위 예는 10초동안 녹음하는 예입니다. 프로그램이 실행되고, URL을 알아오는 등 약간의 소모 시간 때문에 정확하게 10초로 끊어지지는 않을 겁니다. 하지만 일반적인 녹음은 분, 내지 시간 단위로 하실 것이니 몇 초 정도의 오차는 애교로 넘어 가도록 하죠.

30분을 녹음할 것이면 sleep 10s부분을 sleep 30m, 1시간을 녹음할 것이면 sleep 1h 식으로 고치면 됩니다.

예약

모든 스크립트가 에러 없이 잘 돌아간다고 확신이 된다면, 이제 예약을 할 수 있습니다. 이쯤 되면 아실 분은 아시겠지만, 예약은 crontab을 사용할 것입니다. 크론탭의 상세한 사용법은 다른 웹페이지를 검색해 보시기 바랍니다. 어렵지 않습니다. 개인적으로 시간을 지정하는 5개의 파라미터는 할 때마다 헷갈리고 틀리기 쉬운데요, 이럴 때는 온라인 에디터 등을 사용해 파라미터를 올바로 지정했는지 미리 체크하면 좋습니다.

crontab의 기본적인 명령어만 간단하게 남깁니다. 내가 설정한 crontab을 확인하려면 이렇게 합니다.

crontab -l

crontab을 편집하려면 이렇게 합니다.

crontab -e

혹시 VI*가 어렵거나, 반대로 VI*류를 고집한다면 일시적으로 에디터를 변경할 수 있습니다.

EDITOR=/bin/nano crontab -e

nano의 저장, 나가기 키는 Ctrl+x입니다.

소거

라디오 프로그램은 매일매일 방송되기 때문에 예약을 하고 녹음을 하면 모르는 사이에 양이 꽤 불어납니다. 꾸준히 듣기도 힘들고, 애초에 라디오를 자주 듣는 마당에 그렇게 꼬박꼬박 녹음을 할 이유도 드물기도 합니다. 그러므로 매일 녹음을 하는 것 보다는 특별한 순간이나, 아니면 자기가 좋아하는 코너가 있는 경우에만 녹음을 하는 것이 더 좋습니다.

아무튼 무작정 파일이 우수수 늘어나는 것이 별로 좋지 않다고 느껴지신다면, 오래된 파일은 자동으로 지우는 것이 바람직합니다. 이럴 때는 find 명령을 활용하면 되겠네요. 그 예 중 하나가 아래입니다.

remove_old_record
#!/bin/bash
find ~ -maxdepth 1 -mtime +14 -type f -name "*.m4a" -exec echo {} will be deleted \;

2주가 지난 m4a는 지울 것이라는 출력을 합니다. 이 스크립트는 -exec echo … \; 처럼 되어 있으니 실제로 지우지는 않습니다. 이것을 -exec rm {} \; 처럼 바꾸면 실제로 지우는 역할을 하겠죠. 이 스크립트 또한 적절히 크론으로 등록하시면 되겠습니다

마치며

어릴 적 카세트 테이프에 정성껏 라디오 녹음을 하던 추억을 회상하며, 무인 인터넷 방송 녹음 스크립트로 그걸 현대화(?) 해 봤습니다. 이 기능을 활용하면 예전보다 훨씬 쉽게, 그리고 깔끔한 결과물이 나옵니다. 만약 NAS에 개인 스트리밍 서비스까지 가능하면 더욱 좋을 것 같네요. 아무쪼록 결과물들로 좋은 추억을 쌓는데 활용하시기를 부탁드리겠습니다.

다시 한 번 말씀드립니다. 저는 이 글을 불법 복제나 저작권 위반을 조장할 목적으로 적지 않았습니다. 녹음된 파일은 개인적으로만 사용해 주십시오. 함부로 배포하지 말 것을 당부드립니다.

project/unattendedradiorecorder.txt · 마지막으로 수정됨: 2016/11/19 16:10 저자 changwoo

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki