#!/bin/bash set -e set -x chanid=$1 starttime=$2 skip_or_cutlist=$3 if test "$skip_or_cutlist" = "cutlist" -o "$skip_or_cutlist" = "skiplist"; then echo skip_or_cutlist set to ${skip_or_cutlist} by "\$3" else if test "$A1" = "cutlist" -o "$A1" = "skiplist"; then skip_or_cutlist="$A1" else echo Setting skip_or_cutlist to cutlist skip_or_cutlist="cutlist" fi fi overwrite=${overwrite:-1} updatedb=${updatedb:-1} # 1071_20190127040000.ts function get_cut_list { cmd="mythutil --quiet --get${skip_or_cutlist} --chanid $chanid --starttime $starttime | awk -v RS=': +' -v OFS=' ' '/^[0-9]/{gsub(/-/,\",\"); print \$1}'" $debug $cmd } function ffmpeg_concat { ## use solution from stackoverflow ffmpeg concat video and audio out of sync ## this may be overkill and unneeded? outsave_ffconcat="$1" files=$(tail -n +2 "$outsave_ffconcat" | cut -d' ' -f 2) for f in $files; do outf=${workdir}/${f/.${ending}/_tmp.${ending}} inf=${workdir}/$f $ffmpeg -y -i "$inf" -map 0 -c:a ac3 -af apad -c:v copy -shortest -avoid_negative_ts make_zero -fflags +genpts "$outf" if test $? -eq 0; then mv "$outf" "$inf" else echo Error generating $outf. Halt exit 10 fi done $ffmpeg -y -f concat -safe 0 -i $outsave_ffconcat -codec copy -map 0 -metadata \"service_name=$0\" $outfile } framelist="$(get_cut_list)" if test -z "$framelist"; then echo Empty frame list with skip_or_cutlist=$skip_or_cutlist. Stop. exit 0 else echo Frame list: $framelist. fi framelist0=${framelist:0:1} if test "0" = "$framelist0"; then inclbeginning=1 framelist=${framelist:2} else inclbeginning=0 fi echo Cutting every other window beginning with $((1-inclbeginning)). echo Frame list: $framelist if ! test -d $workdir; then mkdir $workdir chmod 1777 $workdir fi fileroot="${chanid}_${starttime}" # should get infile from recorded.basename in db infile=$(ls ${recordingsdir}/${fileroot}.{mpg,ts,mkv,mp4} 2>/dev/null | sort -u | head -n 1) out_ffconcat="${workdir}/${fileroot}.ffconcat" outsave_ffconcat="${workdir}/${fileroot}-save.ffconcat" ending=$(echo "$infile" | awk -v FS='.' '{print $NF}') outfile_tmp="${workdir}/${fileroot}_%05d.${ending}" outfile="${workdir}/${fileroot}.${ending}" if test -z "$infile"; then echo Did not find input file. Stop. exit 8 fi if ! test -r "$infile"; then echo File "$infile" is not readable. Stop. exit 8 fi if test -z "$ending"; then echo Did not find file ending. Stop. exit 9 fi ## https://superuser.com/questions/710008/how-to-get-rid-of-ffmpeg-pts-has-no-value-error/ ffmpegcut="$ffmpeg -fflags '+genpts' -ignore_unknown -y -i \"$infile\" -codec copy -map 0 -map -0:d -f segment -segment_list \"$out_ffconcat\" -segment_frames \"$framelist\" \"${outfile_tmp}\"" echo $ffmpegcut eval $ffmpegcut if test $? -ne 0; then echo "Error in ffmpeg command. Halt." exit 2 fi match="1{p};" n=$(cat $out_ffconcat | wc -l) for((i=$((inclbeginning+2));i<$n;i=i+2)); do match="${match}$i{p};" done echo $match sed -n -e "${match}" $out_ffconcat > $outsave_ffconcat if ! test -r $outsave_ffconcat; then echo File $outsave_ffconcat not created. Halt. exit 3 fi nlines=$(wc -l $outsave_ffconcat | cut -d' ' -f 1) if test "x$nlines" = "x2"; then mv $workdir/$(tail -n 1 $outsave_ffconcat | cut -d' ' -f 2) $outfile else ffmpeg_concat "$outsave_ffconcat" fi if test $? -ne 0; then echo Concat failed. Halt. exit 4 else touch --reference="$infile" "$outfile" if test $overwrite -ne 0; then mv $outfile $destdir/. # only update the db if we overwrite the recording if test $updatedb -ne 0; then myth-rebuild-seektable.sh $chanid $starttime $workdir fi fi fi exit 0 ## (export path=/var/lib/mythtv/recordings/; export file=1031_20181128070100.ts; /usr/local/bin/ffmpeg -y -i ${path}/${file} -f lavfi -i movie=${path}/${file}[out0+subcc] -preset slow -crf 21 -map 0:a -map 1 -map_metadata 1:s:0 -metadata:s:s "language=fre" ${file/.ts/1.mkv}) ##