[[diary/Kojima]]

・ffmpegが文字を食う?

何が原因かよく分からないのだけれど、とりあえず症状を絞り込めたので。。

「らじる★らじる」の録音用スクリプト、rtmpdumpで録音した後、
ffmpegでflvからm4aに変換する部分、こういう感じの処理にしている。

 #!/bin/sh                                                                 
 
 flvfile=/home/kojima/Radiru_new/test1.flv
 m4afile=/home/kojima/Radiru_new/test1.m4a
 ffmpeg -v error -i $flvfile -acodec copy $m4afile
 
 sleep 3
 if [ -f "$m4afile" ]; then
     rm -f $flvfile
 fi

このスクリプト、手動で実行する限り特に問題なく終了するのだけれど、
at経由で実行すると、ffmpegの次の行やその次の行が食われて、cron からエラーメールが届くことになる。

 $ cat ~/Maildir/new/1441892102.V803I18473dM4378.corei3 
 Return-Path: <kojima@corei3.linet.gr.jp>
 X-Original-To: kojima
 Delivered-To: kojima@corei3.linet.gr.jp
 Received: by corei3.linet.gr.jp (Postfix, from userid 1000)
         id E8FBC20793D; Thu, 10 Sep 2015 22:35:01 +0900 (JST)
 Subject: Output from your job    10485
 To: kojima@corei3.linet.gr.jp
 Message-Id: <20150910133501.E8FBC20793D@corei3.linet.gr.jp>
 Date: Thu, 10 Sep 2015 22:35:01 +0900 (JST)
 From: kojima@corei3.linet.gr.jp (KOJIMA Mitsuhiro) 
 
 sh: 行 53: 一致する `"' を探索中に予期しないファイル終了 (EOF) です
 sh: 行 60: 構文エラー: 予期しないファイル終了 (EOF) です


この例は if [ -f " あたりまで食われてしまっているようだけど、
あれこれ試したら sleep 3 が食われて "leep not found" や "3 not found"みたいな
エラーになることもある。

当初はファイル名依存の問題なのかな、と思っていたけれど、
あれこれ条件を変えながら試してみると、
どうもファイル名ではなく、
録音時間が1時間を越えるとこのエラーが発生し、
録音時間が長くなる(= ffmpeg で変換するサイズが大きくなる)につれて、
食われる文字数が増えてゆく感じ。

# 録音時間が15分程度の語学講座だとこの問題は発生せず、1時間を越えると発生しだす模様

何となく ffmpeg のメモリ管理回りのバグっぽい気がしているのだけれど、cron ではなく直接このシェルスクリプトを実行すると同じエラーが起きないのが謎。

# stdin/stdout が繋がってるか否かにも依存するのかなぁ?

とりあえず、ffmpeg の変換の次の行に、

 ####################################### this is only a place holder

みたいな食われるための行を追加してやれば回避できそうなんだけど、
いまいち納得行かないところ。
- http://stackoverflow.com/questions/20200097/bash-scripting-ffmpeg-how-to-wait-the-process-to-complete あたりが参考になりそうです。 -- [[tamu]] &new{2015-09-12 (土) 19:54:50};
- なるほど。確かに 

 ffmpeg -v error -i $flvfile -acodec copy $m4afile < /dev/null

みたいに何か標準入力をつないでやるとエラーは発生しなくなったですね。
(標準出力は /dev/null にしなくても大丈夫みたい)

やっぱりffmpegが標準入力からの入力を求め、
/dev/stdin なりにつながってれば実際のデータは来なくてもそれで満足するけれど、
at で実行して標準入力が無い場合はスクリプト自身を食ってしまう、ということなのかな -- [[kojima]] &new{2015-09-14 (月) 21:30:11};
/dev/stdin なりにつながっていて読めれば実際のデータの有無は構わないものの、at で実行して標準入力が無い場合はスクリプト自身を食ってしまう、ということなのかな -- [[kojima]] &new{2015-09-14 (月) 21:30:11};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS