MythTV transcoding user job
For some reason I was having trouble with existing online MythTV transcoding jobs. Specifically this and MythBrake were nice but after many attempts I couldn't get HandbrakeCLI to output a decent quality video and opted to write my own using ffmpeg.
Please be aware this script will automatically cut out commercials even if mythcommflag is inaccurate.
To get started copy the script into a file on your mythbackend box. In the example below it is called transcode.sh. Then `chmod +x` and review the contents of the `./transcode.sh -h` help command like so:
Here is the script:
Please be aware this script will automatically cut out commercials even if mythcommflag is inaccurate.
To get started copy the script into a file on your mythbackend box. In the example below it is called transcode.sh. Then `chmod +x` and review the contents of the `./transcode.sh -h` help command like so:
[richie@localhost mythtv]$ chmod +x transcode.sh [richie@localhost mythtv]$ ./transcode.sh -h Transcodes a video to .mkv auto cutting commercials. User job example: /home/richie/mythtv/transcode.sh -c %CHANID% -s %STARTTIMEUTC% -v show version -h show usage -l limit CPU usage -s [arg] starttime from mythtv. In user job %STARTTIMEUTC% -c [arg] chanid from mythtv. In user job %CHANID% -u [arg] MySql username -p [arg] MySql password -o [arg] output Directory -t [arg] temp Directory -r [arg] ffmpeg crf. See: https://trac.ffmpeg.org/wiki/Encode/H.264 -z [arg] ffmpeg preset. See: https://trac.ffmpeg.org/wiki/Encode/H.264
Here is the script:
#!/bin/bash
# ------------------------------------------------------------------
# [Author] Richard Kanavati
# A simple MythTV script to transcode video to mkv
# ------------------------------------------------------------------
# ---------User Variable Defaults-----------------------------------
# For simplicity in configuring a MythTV user job, default command
# line parameters can be specified here.
# These will be overridden if you supply command line parameters.
db_user="mythtv"
db_password="mythtv"
output_dir="~/"
temp_dir="/tmp"
mythtranscode_options="--mpeg2 --honorcutlist"
ffmpeg_crf=23
ffmpeg_preset="slow"
limit_cpu=1
# ------------------------------------------------------------------
set -e
trap 'exit_handler' EXIT
exit_handler()
{
if [ -e "$temp_transcoding_file" ]; then
rm "$temp_transcoding_file"
fi
if [ -e "$temp_transcoding_file.map" ]; then
rm "$temp_transcoding_file.map"
fi
}
display_usage() {
local directory="$(cd "$(dirname "${0}")"; echo $(pwd))"
local file="${directory}/$(basename "${0}")"
echo "Transcodes a video to .mkv auto cutting commercials."
echo "User job example: $file -c %CHANID% -s %STARTTIMEUTC%"
echo ""
echo "-v show version"
echo "-h show usage"
echo "-l limit CPU usage"
echo "-s [arg] starttime from mythtv. In user job %STARTTIMEUTC%"
echo "-c [arg] chanid from mythtv. In user job %CHANID%"
echo "-u [arg] MySql username"
echo "-p [arg] MySql password"
echo "-o [arg] output Directory"
echo "-t [arg] temp Directory"
echo "-r [arg] ffmpeg crf. See: https://trac.ffmpeg.org/wiki/Encode/H.264"
echo "-z [arg] ffmpeg preset. See: https://trac.ffmpeg.org/wiki/Encode/H.264"
}
if [ $# == 0 ] ; then
display_usage
fi
while getopts ":s:c:u:p:o:t:r:z:vhl" optname
do
case "$optname" in
v)
echo "Version $VERSION"
exit 0;;
c)
chanid=${OPTARG};;
s)
starttime=${OPTARG};;
l)
limit_cpu=1;;
m)
db_user=${OPTARG};;
p)
db_password=${OPTARG};;
o)
output_dir=${OPTARG};;
t)
temp_dir=${OPTARG};;
r)
ffmpeg_crf=${OPTARG};;
z)
ffmpeg_preset=${OPTARG};;
h)
display_usage;
exit 0;;
esac
done
if [ -z "$chanid" ] || [ -z "$starttime" ]; then
echo
echo "Must supply -c and -s parameters!";
echo
display_usage
exit 1
fi
if [ "$limit_cpu" -eq 1 ]; then
renice 19 $$
ionice -c 3 -p $$
fi
sql="
SELECT
s.dirname as storagegroup,
r.basename,
r.commflagged,
CONCAT(r.title,' ', CASE
WHEN r.season > 0
THEN concat('s', lpad(r.season,2,0), 'e', lpad(r.episode,2,0), ' ')
ELSE ''
END, r.subtitle) AS title
FROM
recorded r
JOIN storagegroup s
ON s.groupname = r.storagegroup
WHERE
r.chanid = '$chanid'
and r.starttime='$starttime'
LIMIT 1;
"
query_results=$(mysql -u"$db_user" -p"$db_password" -Dmythconverg -NBse "$sql")
if [ ! "$query_results" ]; then
echo "Could not locate video in the mythtv database."
exit 1
fi
storage_group=$(echo "$query_results"|cut -f1)
if [ ! "$storage_group" ]; then
echo "Could not locate storage group in the mythtv database."
exit 1
fi
basename=$(echo "$query_results"|cut -f2)
commflagged=$(echo "$query_results"|cut -f3)
title=$(echo "$query_results"|cut -f4|sed 's/ *$//'|sed "s/[:?]/ /g"|sed "s/[.]//g")
if [ ! "$title" ]; then
title="unknown_title_${starttime}"
fi
transcoding_file="$storage_group$basename"
temp_transcoding_file="$temp_dir/${chanid}_$starttime.mpg"
output_file="$output_dir/$title.mkv"
if [ -e "$output_file" ]; then
output_file="$output_dir/${title}_$starttime.mkv"
fi
if [ $commflagged -eq 0 ]; then
/usr/bin/mythcommflag --chanid "$chanid" --starttime "$starttime"
fi
/usr/bin/mythutil --chanid "$chanid" --starttime "$starttime" --gencutlist
/usr/bin/mythtranscode --chanid "$chanid" --starttime "$starttime" --allkeys --buildindex --mpeg2 --showprogress
/usr/bin/mythtranscode --chanid "$chanid" --starttime "$starttime" $mythtranscode_options -o "$temp_transcoding_file"
/usr/bin/mythcommflag --file "$temp_transcoding_file" --rebuild
/usr/bin/ffmpeg -i "$temp_transcoding_file" -c:v libx264 -preset "$ffmpeg_preset" -crf "$ffmpeg_crf" -c:a copy "$output_file"
Comments
Post a Comment