鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

もう春だし、語学の勉強のために、ラジオ録音に挑戦してみたいなぁ

さくらVPS使っているから、挑戦してみるか・・・

http://namaraii.com/archives/19670

sudo yum install -y rtmpdump swftools ffmpeg

…
Setting up Install Process
No package rtmpdump available.
No package swftools available.
No package ffmpeg available.
Error: Nothing to do

http://centos.server-manual.com/centos6_repository.html

Elrepo

sudo rpm -ivh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm
http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm を取得中
curl: (22) The requested URL returned error: 404
エラー: skipping http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm - transfer failed

elrepoのURLが変わっていたので http://elrepo.org/tiki/tiki-index.php

sudo rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

DropBoxをsupervidord経由で起動

/etc/supervidord.d/dropbox.confを作成

[program:dropbox]

user=tatsumi
command=/home/tatsumi/.dropbox-dist/dropboxd
directory=/home/tatsumi/
redirect_stderr=true
stdout_logfile=/var/log/supervisord/dropbox.log
stdout_logfile_maxbytes = 5MB
stderr_logfile=/var/log/supervisord/dropbox.err
stderr_logfile_maxbytes = 5MB
stdout_logfile_backups = 5
autorestart = true
startsecs = 5
supervidorctrl update

これでデーモン化終了

最後に・・・

コマンドもインストールした、さぁ録音してみるか・・・ ここまでやっておいて、 おいおいNHKラジオの録音したかったのに。入ってないのかい!! どてぇ。。

きをとりなおして、ググる

こちらに有った。 http://akiradeveloper.hatenadiary.com/entry/2013/05/02/175120

cd 
git clone https://github.com/akiradeveloper/radikorec.git
sudo make
sudo make install
chmod +x ~/radikorec/bin/radikorec

基礎英語1(月曜から金曜日の朝6:00から15分間)を録音したいのでcrontabに記入するか。

crontab -e

0 6 * * 1-5 source ~/.bash_profile;/home/tatsumi/radikorec/radikorec_wrapper --channel NHK2 --duration 15 --prefix KISO_EIGO1 --directory /home/tatsumi/Dropbox/radio

さぁ、うごけぇーー が、世の中そんなに甘くないようで・・

RTMPDump v2.3
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: No application or playpath in URL!
Connecting ...
WARNING: HandShake: Type mismatch: client sent 6, server answered 9
WARNING: HandShake: Server not genuine Adobe!
ERROR: RTMP_Connect1, handshake failed.

そうです。rtmdumpのバージョンが2.3で一つ古いのです。 こちらを見ながらソースから2.4をインストール http://memorandum.yamasnet.com/archives/Post-1383.html

動いたようです!でも、ちょっとファイルサイズがでかい気もするけどこんなものかな。

ファイルが大きい原因

radikorecの中でffmpegのオプションが「-acodec copy」になっているからなんですが、 rawファイルのままコピーするという意味でした。

faad2のインストール

sudo yum install faad2

http://njet.oops.jp/wordpress/2010/12/16/faad2%E3%81%A8lame%E3%81%A7m4a%E3%82%92mp3%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/

radikorecコマンドを改造

mp3に変換するようにfaad(m4a->wav)とlame(wav->mp3)を呼び出すようにする。

#!/usr/bin/env python

import os
import commands
from argparse import ArgumentParser

import radiru
import radiko

class Config: 
    def __init__(self, args):
        self.args = args    

        self.duration_sec = 60 * args.duration + 30
        
        self.P("\n--**-- %s --**--" % commands.getoutput("date -u"))
        
        date = commands.getoutput("TZ=JST-9 date +'%Y-%m-%d-%H-%M'")
        
        self.filename = "/".join( [args.directory, "%s-%s.mp3" % (args.prefix, date)] ) 
        self.P(self.filename)
        
    def P(self, msg):
        LOGFILE = "/tmp/radikorec.log"
        f = open(LOGFILE, "a")
        f.write(str(msg) + "\n")
        f.close
        
        if self.args.debug:
            print(msg)
            
    def R(self, command, debug=True):
        if debug:
            self.P(command) 
            
        if not self.args.dry_run:
            return os.system(command)

if __name__ == '__main__':
    parser = ArgumentParser(description="A Simple Radiko/Radiru Recorder")
    
    parser.add_argument('--duration', type=int, default=1, help="time(min) to record. default(1)")
    parser.add_argument('--prefix', default='RADIKOREC', help="filename prefix. default(RADIKOREC)")
    parser.add_argument('--rtmpbin', default='rtmpdump', help="The path for rtmpdump binary >= 2.4. default(rtmpdump)")
    parser.add_argument('--channel', default='RN1', help="default(RN1)")
    parser.add_argument('--directory', default='/tmp', help="output directory. default(/tmp)")
    parser.add_argument('--debug', action='store_true', default=False, help="print messages on console.")
    parser.add_argument('--dry-run', action='store_true', default=False, help="don't actually execute")
    
    args = parser.parse_args()
    
    config = Config(args)
    config.P(args)

    # make m4a file
    command1 = None
    if radiru.CHANNEL_MAP.has_key(args.channel):
        config.P("use RADIRU")
        command1 = radiru.getCommand1(config)
    else:     
        config.P("use RADIKO")
        command1 = radiko.getCommand1(config)
        
    if command1 is None:
        config.P("ERROR channel not valid")
        exit(1)
        
    repeat = 0     
    while repeat < 10:
        r = config.R(command1)
        if r is not 0:
            config.P("ERROR command1 %d" % r)
            repeat += 1
        else:     
            break
        
    if repeat is 10:
        config.P("ERROR all command1 retries failed")
        exit(1)
    
    # fix the file
    config.R("mv %s %s.raw" % (config.filename, config.filename))

    command2 = "ffmpeg  -t %d -i %s.raw -acodec copy %s.m4a".strip() % (config.duration_sec, config.filename, config.filename)
    r = config.R(command2)
    if r is not 0:
        config.P("ERROR command2 %d" % r)
    
    config.R("rm %s.raw" % config.filename)

    command3 = "faad -o %s.wav %s.m4a".strip() % (config.filename, config.filename)
    r = config.R(command3)
    if r is not 0:
        config.P("ERROR command3 %d" % r)
    config.R("rm %s.m4a" % config.filename)
    
    command4 = "lame --resample 16 -b 48 %s.wav %s".strip() % (config.filename, config.filename)
    r = config.R(command4)
    if r is not 0:
        config.P("ERROR command4 %d" % r)
    config.R("rm %s.wav" % config.filename)

あとは、ちょっとやり方がわからなかったので、 radikorec/radikorec_wrapperからradikorec/bin/radirerecをフルパス指定で呼び出すように修正しました。

でも、結局ファイルサイズ小さくならなかった!!!!