2012年02月20日

mediatombにBRAVIA対応2

いろいろなサイトを検索し、試行錯誤の結果
私の鯖で動くmediatombはこうなった

1.まず、過去記事の内容でmediatomb構築
mediatombにBRAVIA対応パッチ適用
http://sanahi.seesaa.net/article/220128357.html


2.トランスコードOFF
ネットブックで鯖を運用している性質上、トランスコードは再生スピードに
変換処理が合いませんでした
(1分30秒程の動画のトランスコードに2分かかるとか。。。)
mpeg2で変換が必要なのは私の環境ではBRAVIAだけで、
その他のDLNAクライアント(Androidスマートフォン)はmp4,flvでも再生できる
無理に鯖に負荷をかけることはやめました

/usr/local/etc/mediatomb/config.xml

...
<transcoding enabled="no">
<mimetype-profile-mappings>
<transcode mimetype="video/x-flv" using="video-common"/>
<transcode mimetype="video/quicktime" using="video-common"/>
...



3.静的にトランスコード
上記によりBRAVIAでの再生ができないのですが、
mediatomb公開ディレクトリのうちBRAVIA専用のディレクトリを設け、
そこのディレクトリの動画ファイルを置けば、mpeg2にcronで自動変させるようにしました

/usr/local/etc/mediatomb/transcode_all.sh

更新1(2012/02/26):
初期化パラメータ処理追加(多重起動チェックの改善)
リトライ時のAudioビットレートを64kから128kに変更
更新1(2012/03/18):
BRAVIAの設定をどうがんばっても横長になる動画があるのでアスペクト比を4:3固定に変更
(-aspect 4:3)


#!/bin/sh

TranscodeAllSeek(){
for ELEM in * ; do
if [ -f "$ELEM" ] ; then
#echo "$ELEM is File"
SRC_EXT=${ELEM##*.}
for ok_ext in $@ ; do
#echo "ext=${ok_ext}"
if [ $SRC_EXT = ${ok_ext} ] ; then
transcode-video "$ELEM";
fi
done
fi
if [ -d "$ELEM" ] ;then
#echo "$ELEM is Directory"
(cd "$ELEM";TranscodeAllSeek "$@";)
fi
done
}

transcode-video(){
src=$1
src_tmp=$src.src_tmp
dst_tmp=$src.dst_tmp
dst=${1%.*}.mpeg
echo "transcode-video(): $src -> .mpeg"
mv "$src" "$src_tmp"
/usr/local/bin/ffmpeg -threads 2 -i "$src_tmp" -vcodec mpeg2video -aspect 4:3 -b 4096k -acodec mp2 -ab 192k -ac 2 -f dvd -
> "$dst_tmp" 2>/dev/null
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ] ; then
echo "Error: $EXIT_CODE ReTry -r 30"
/usr/local/bin/ffmpeg -threads 2 -i "$src_tmp" -vcodec mpeg2video -aspect 4:3 -b 4096k -acodec mp2 -ab 192k -ac 2 -r 30 -f

dvd - > "$dst_tmp" 2>/dev/null
EXIT_CODE=$?
fi

if [ $EXIT_CODE -ne 0 ] ; then
echo "Error: $EXIT_CODE Retry -ab 128k"
/usr/local/bin/ffmpeg -threads 2 -i "$src_tmp" -vcodec mpeg2video -aspect 4:3 -b 4096k -acodec mp2 -ab 128k -ac 2 -f dvd -
> "$dst_tmp" 2>/dev/null
EXIT_CODE=$?
fi

if [ $EXIT_CODE -ne 0 ] ; then
echo "Error: $EXIT_CODE Retry -r 30 -ab 128k"
/usr/local/bin/ffmpeg -threads 2 -i "$src_tmp" -vcodec mpeg2video -aspect 4:3 -b 4096k -acodec mp2 -ab 128k -ac 2 -r 30 -f
dvd - > "$dst_tmp" 2>/dev/null
EXIT_CODE=$?
fi

if [ $EXIT_CODE -eq 0 ] ; then
mv "$dst_tmp" "$dst"
rm "$src_tmp"
echo "Success"
else
rm "$dst_tmp"
echo "Error: $EXIT_CODE GiveUp!!"
fi
}


# check multiple boot Begin
SCRIPT_PID=~/${0##*/}.pid
if [ $1 = "-init" ] ; then
echo "initialize"
if [ -f "$SCRIPT_PID" ]; then
rm $SCRIPT_PID
fi
exit 0
fi
if [ -f $SCRIPT_PID ]; then
PID=`cat $SCRIPT_PID `
if (ps -aux | awk '{print $2}' | grep $PID >/dev/null); then
exit 1
fi
fi
echo $$ > $SCRIPT_PID


# main script
for TARG in "$@" ; do
cd "$TARG";
TranscodeAllSeek "flv FLV qt QT mov MOV mp4 MP4 avi AVI rmvb RMVB 3gp 3GP"
done


# check multiple boot End
rm $SCRIPT_PID

この変換スクリプトは、指定ディレクトリから再帰的にファイルを検索し、
変換対象のファイルがあれば、変換を行います
変換に失敗した場合、同じ処理を行わせないようになっています

変換中は、
[元ファイル名.[ext]].src_tmp
[元ファイル名.[ext]].dst_tmp
があります

変換成功した場合は
[元ファイル名.mpeg]
だけが残ります

変換失敗した場合は
[元ファイル名.[ext]].src_tmp
だけが残ります
再変換したい場合は、.src_tmpを消せばOK


この変換スクリプトにはいくつか問題があります

多重起動処理にごくまれなケースで問題があります(放置)

ffmpegでの変換処理は試行錯誤中です
失敗したら別のパラメータでリトライさせています

・30fpsでリトライ(15fpsの動画ファイル(mp4)で失敗)
・音声128kbpsでリトライ(192kbpsに失敗(3gp))
・上記2つを組み合わせたものでリトライ



cron

更新1(2012/02/26):
起動時に初期化処理追加(多重起動チェックの改善)


> crontab -l
MAILTO=root
@reboot /usr/local/etc/mediatomb/transcode_all.sh -init
*/30 * * * * /usr/local/etc/mediatomb/transcode_all.sh ~/public_html/data/Video/BRAVIA/

cronは30分毎にチェックさせています


posted by sanahi at 23:00| 滋賀 ☀| Comment(0) | TrackBack(0) | FreeBSD | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。