エンコード


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

MythTVへのUser Jobの登録方法

  • MythTVにUser Jobを登録します。 【mythtv-setup】の項目を参照。
  • MythWEBなどでの録画予約時に「Transcode to H.264」にチェックを入れることで、録画後に登録したUser Jobが実行される。


H.264へのエンコードスクリプト、改訂版2

  • 前回の改訂版では音ズレが発生する場合があるので、映像と音声を別々に処理する方式に戻しました。
  • ネットワーク越しの再生時に再生が追い付かない場合があったので、ビットレートを落としました。
    これでエンコード後のサイズが660MB程度になります。
  • 一時ファイル名を変えて、複数Jobの同時実行にも対応出来るようにしました。(たぶん)
#!/bin/bash

# full userjob command in mythtv-setup :
#   /path/to/transcode-h264.sh "%DIR%/%FILE%" "%CHANID%" "%STARTTIME%"
# Arguments
# $1 : recorded file.
# $2 : chanid.
# $3 : starttime.

# set folder and file name
DIRNAME=`dirname "$1"`
FILENAME=`echo "$1" | awk -F/ '{print $NF}'`
TEMPDIR="$DIRNAME/temp"

# set temporary files
VIDEOFILE="$FILENAME.264"
AUDIOTMP="$FILENAME.wav"
AUDIOFILE="$FILENAME.aac"
DATABASEUSER="mythtv"
DATABASEPASSWORD="mythtv"
SQLTMP="update-database.sql"

# create .264
ffmpeg -y -i "$DIRNAME/$FILENAME" -coder 0 -level 13 -threads 4 -vcodec libx264 \
    -rc_eq "blurCplx^(1-qComp)" -vpre baseline -deinterlace -r 30000/1001 -aspect 16:9 \
    -maxrate 768000 -bufsize 3000000 -bt 3000k -b 3000k -async 50 -f h264 "$TEMPDIR/$VIDEOFILE" > /dev/null 2>&1

# create wav
ffmpeg -y -i "$DIRNAME/$FILENAME" -acodec pcm_s16le -ac 2 -ar 48000 "$TEMPDIR/$AUDIOTMP" > /dev/null 2>&1

# convert wav to aac
ffmpeg -y -i "$TEMPDIR/$AUDIOTMP" -vn -acodec libfaac -ab 192k -f mp4 "$TEMPDIR/$AUDIOFILE" > /dev/null 2>&1

# move original file to temporary folder
mv "$DIRNAME/$FILENAME" $TEMPDIR

# join to mp4 file, and override to original file
ffmpeg -y -i "$TEMPDIR/$VIDEOFILE" -i "$TEMPDIR/$AUDIOFILE" -vcodec copy -acodec copy \
    "$DIRNAME/$FILENAME".mp4 > /dev/null 2>&1
mv "$DIRNAME/$FILENAME".mp4 "$DIRNAME/$FILENAME"

# update recorded table to new file size.
NEWFILESIZE=`du -b "$DIRNAME/$FILENAME" | cut -f1`
echo "UPDATE recorded SET basename='$FILENAME',filesize='$NEWFILESIZE',transcoded='1' \
     WHERE chanid='$2' AND starttime='$3';" > "$TEMPDIR/$SQLTMP"
mysql --user=$DATABASEUSER --password=$DATABASEPASSWORD mythconverg < "$TEMPDIR/$SQLTMP"

# cleanup temporary files
rm "$TEMPDIR/$VIDEOFILE"
rm "$TEMPDIR/$AUDIOTMP"
rm "$TEMPDIR/$AUDIOFILE"
rm "$TEMPDIR/$SQLTMP"



H.264へのエンコードスクリプト、改訂版

  • ffmpegを0.7に上げたせいか、プリセットの構成が変わってしまいました。
    その回避も含めて、エンコードスクリプトを変更したのでアップします。
  • 今回は、映像と音声を一度にエンコードするようにしました。
#!/bin/bash

# full userjob command in mythtv-setup :
#   /path/to/transcode-h264.sh "%DIR%/%FILE%" "%CHANID%" "%STARTTIME%"
# Arguments
# $1 : recorded file.
# $2 : chanid.
# $3 : starttime.

# set folder and file name
DIRNAME=`dirname "$1"`
FILENAME=`echo "$1" | awk -F/ '{print $NF}'`
TEMPDIR="$DIRNAME/temp"

# set temporary files
DATABASEUSER="mythtv"
DATABASEPASSWORD="mythtv"
SQLTMP="update-database.sql"

# create .mp4
ffmpeg -y -i "$DIRNAME/$FILENAME" -threads 0 -f mp4 -vcodec libx264 -vpre baseline \
   -r 30000/1001 -aspect 16:9 -b 4000k -bt 4000k -vsync 1 -acodec libfaac -ac 2 -ar 48000 -ab 128k \
   "$DIRNAME/$FILENAME".mp4 > /dev/null 2>&1

# move original file to temporary folder
mv "$DIRNAME/$FILENAME" $TEMPDIR

# rename .mp4 to original file
mv "$DIRNAME/$FILENAME".mp4 "$DIRNAME/$FILENAME"

# update recorded table to new file size.
NEWFILESIZE=`du -b "$DIRNAME/$FILENAME" | cut -f1`
echo "UPDATE recorded SET basename='$FILENAME',filesize='$NEWFILESIZE',transcoded='1' \
  WHERE chanid='$2' AND starttime='$3';" > "$TEMPDIR/$SQLTMP"
mysql --user=$DATABASEUSER --password=$DATABASEPASSWORD mythconverg < "$TEMPDIR/$SQLTMP"

# cleanup temporary files
rm "$TEMPDIR/$SQLTMP"

# not delete original file
# rm "$TEMPDIR/$FILENAME"




H.264へのエンコードスクリプト

  • 録画ファイルが30分で約4GBと巨大になり、HDD容量を圧迫します。
    また、番組によっては純正mplayerで正常に再生出来ない場合があります(AACの音声切替の問題と思われます)。
  • そのため、録画したファイルをH.264形式にエンコードすることにより、ファイルサイズを圧縮します。
    また、このエンコードにより、正常に再生出来なかった現象を解消することが出来ます。

  • このスクリプトは、ffmpegのみでエンコードを実施しています。
  • ffmpegのオプションは詰め切れていません。もっといいオプションがあるかもしれません。
  • vpreに設定する値は、/usr/share/ffmpeg/libx264-*.ffpresetのファイル名になります。
    下記スクリプトはfastにしてありますが、エンコード時間と画質を見て適宜変更してください。

  • TEMPDIRを、録画フォルダ配下のtempフォルダに設定してあります。 フォルダを作成するか、TEMPDIRを別の場所に変更してください。
  • DATABASEPASSWORDを、各自の環境に合わせてください。
  • 最終行のコメントを外すことでオリジナルファイルの自動削除が出来ますが、エンコードが安定するまでは外さないことを推奨します。

  • まずは、コマンドラインから実行して、きちんとエンコード出来ることを確かめてください。
/usr/local/bin/transcode-h264.sh
#!/bin/sh

# full userjob command in mythtv-setup :
#   /path/to/transcode-h264.sh "%DIR%/%FILE%" "%CHANID%" "%STARTTIME%"
# Arguments
# $1 : recorded file.
# $2 : chanid.
# $3 : starttime.

# set folder and file name
DIRNAME=`dirname "$1"`
FILENAME=`echo "$1" | awk -F/ '{print $NF}'`
TEMPDIR="$DIRNAME/temp"

# set temporary files
AUDIOTMP="audio.wav"
AUDIOFILE="audio.aac"
VIDEOFILE="video.264"
DATABASEUSER="mythtv"
DATABASEPASSWORD="mythtv"
SQLTMP="update-database.sql"

# create .264
ffmpeg -y -i "$DIRNAME/$FILENAME" -coder 0 -level 13 -threads 4 -vcodec libx264 \
  -rc_eq "blurCplx^(1ーqComp)" -vpre fast -deinterlace -r 30000/1001 -aspect 16:9 \
  -b 4000k -bt 4000k -async 50 -f h264 "$TEMPDIR/$VIDEOFILE" > /dev/null 2>&1
# create wav
ffmpeg -y -i "$DIRNAME/$FILENAME" -acodec pcm_s16le -ac 2 -ar 48000 "$TEMPDIR/$AUDIOTMP"
# convert wav to aac > /dev/null 2>&1
ffmpeg -y -i "$TEMPDIR/$AUDIOTMP" -vn -acodec libfaac -ab 192k -f mp4 "$TEMPDIR/$AUDIOFILE" > /dev/null 2>&1

# move original file to temporary folder
mv "$DIRNAME/$FILENAME" $TEMPDIR

# join to mp4 file, and override to original file
ffmpeg -y -i "$TEMPDIR/$VIDEOFILE" -i "$TEMPDIR/$AUDIOFILE" -vcodec copy -acodec copy \
  "$DIRNAME/$FILENAME".mp4 > /dev/null 2>&1
mv "$DIRNAME/$FILENAME".mp4 "$DIRNAME/$FILENAME"

# update recorded table to new file size.
NEWFILESIZE=`du -b "$DIRNAME/$FILENAME" | cut -f1`
echo "UPDATE recorded SET basename='$FILENAME',filesize='$NEWFILESIZE',transcoded='1' \
  WHERE chanid='$2' AND starttime='$3';" > "$TEMPDIR/$SQLTMP"
mysql --user=$DATABASEUSER --password=$DATABASEPASSWORD mythconverg < "$TEMPDIR/$SQLTMP"

# cleanup temporary files
rm "$TEMPDIR/$AUDIOTMP"
rm "$TEMPDIR/$AUDIOFILE"
rm "$TEMPDIR/$VIDEOFILE"
rm "$TEMPDIR/$SQLTMP"

# not delete original file
# rm "$TEMPDIR/$FILENAME"




User Jobの不具合


MythTV-0.23から0.24に上げた時に、User Job実行時にmythbacbackendが無反応になる現象が出ましたが、
一度アンインストールして入れ直すことで復旧しました。
同様の現象が出ている方はお試しください。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。