[mythtv-users] FFMPeg Commercial cutting puts audio out of sync
Justin Alcorn
justin at jalcorn.net
Sun Sep 14 04:21:03 UTC 2014
On Sat, Sep 13, 2014 at 10:19 PM, Justin Alcorn <justin at jalcorn.net> wrote:
> That's exactly what I was thinking. Thanks for the example.
Thanks for all the help. This works perfectly to losslessly cut the
H.264 Encoded recording, and put it in a mp4 container for mythroku.
It also takes just seconds on a medium powered machine.
Run as UserJob /usr/local/bin/rokuencode.sh %DIR% %FILE%
=================================================
#!/bin/bash
logfile=/home/mythtv/save/$$.log
# Close STDOUT file descriptor
exec 1<&-
# Close STDERR FD
exec 2<&-
# Open STDOUT as $LOG_FILE file for read and write.
exec 1<>$logfile
# Redirect STDERR to STDOUT
exec 2>&1
INPUTFILE="${1}/${2}"
workdir="/tmp/$$"
mkdir -p ${workdir}
if [ ! -f $INPUTFILE ]; then
echo "file doesn't exist, aborting."
exit 1
fi
#see if we have the DB info
test -f /etc/mythtv/mysql.txt && . /etc/mythtv/mysql.txt
test -f ~/.mythtv/mysql.txt && . ~/.mythtv/mysql.txt
#let's make sure we have a sane environment
if [ -z "`which ffmpeg`" ]; then
echo "FFMpeg not present in the path. Adjust environment or install ffmpeg"
exit 1
fi
mysqlconnect="mysql -N -hlocalhost -umythtv -ppassword mythconverg"
export mysqlconnect
#deteremine directory and filename
RECDIR=`dirname $INPUTFILE`
BASENAME=`basename $INPUTFILE`
tmp=`basename $BASENAME .mpg`
chanid=`echo "select chanid from recorded where
basename=\"$BASENAME\";" | $mysqlconnect`
starttime=`echo "select starttime from recorded where
basename=\"$BASENAME\";" | $mysqlconnect`
if [ -z "$chanid" -o -z "$starttime" ];then
echo "Info not found for select chanid from recorded where
basename=\"$BASENAME\""
exit 1;
fi
#lets make sure we have a cutlist before we proceed
if [ -z "`mythutil --getcutlist --chanid $chanid --starttime
"$starttime" | grep Cutlist | sed 's/Cutlist: $//'`" ]; then
echo "no cutlist found....generating new cutlist"
mythutil --chanid $chanid --starttime "$starttime" --gencutlist
#&>${logfile}
fi
CUTLIST=`mythutil --chanid $chanid --starttime "$starttime"
--getcutlist | grep Cutlist | sed 's/Cutlist: //' | sed 's/-/,/g' |
sed 's/^0,//'`
echo $CUTLIST
echo "ffmpeg -i ${RECDIR}/${BASENAME} -map 0 -c copy -f ssegment
-segment_list ${workdir}/out.ffconcat -segment_frames $CUTLIST
${workdir}/out%03d.mp4"
ffmpeg -i ${RECDIR}/${BASENAME} -map 0 -c copy -f ssegment
-segment_list ${workdir}/out.ffconcat -segment_frames $CUTLIST
${workdir}/out%03d.mp4
cat ${workdir}/out.ffconcat | awk 'NR%2==1' > ${workdir}/in.ffconcat
echo "ffmpeg -f concat -i ${workdir}/in.ffconcat -c copy ${RECDIR}/${tmp}.mp4"
ffmpeg -y -f concat -safe 0 -i ${workdir}/in.ffconcat -c copy
${RECDIR}/${tmp}.mp4
#well need a new filesize to update the db with
filesize=$(du -b ${RECDIR}/${tmp}.mp4 | awk '{print $1}')
#update db with new filesize and filename
cat <<EOF | $mysqlconnect
UPDATE
recorded
SET
filesize = ${filesize},
cutlist = 0,
basename = "${tmp}.mp4"
WHERE
chanid = ${chanid} AND
starttime = "${starttime}";
EOF
#delete the old commercial skip info
cat <<EOF | $mysqlconnect
DELETE FROM
recordedmarkup
WHERE
chanid = ${chanid} AND
starttime = "${starttime}" AND
(type = 4 OR type = 5);
EOF
cat <<EOF | $mysqlconnect
DELETE FROM
recordedseek
WHERE
chanid = ${chanid} AND
starttime = "${starttime}";
EOF
#cleanup $workdir
rm -rf ${workdir}/*${tmp}*
=========================================================================
--
Justin B. Alcorn
PGP Fingerprint A36D D691 C5B0 BE15 5A2A AF49 AA1C 372C
More information about the mythtv-users
mailing list