View unanswered posts    View active topics

All times are UTC - 6 hours





Post new topic Reply to topic  [ 1 post ] 
Print view Previous topic   Next topic  
Author Message
Search for:
PostPosted: Mon Feb 04, 2019 8:05 am 
Offline
Joined: Tue Aug 08, 2006 7:08 pm
Posts: 561
Location: UK
I had a few problematic .ts files that when playing back, would work but would not Fast Forward properly (The built in player would freeze for a bit then exit to the Title Done/Play screen). I tried using my demuxmux script, but that would fail with ProjectX not liking files with a mono sound track. So finally, after playing around with ffmpeg I came up with a couple of scripts, though I don't know if they might be useful for somebody else:

The first one is fixvid.sh which just cleans up the file, and gives the option to reencode the audio from mono mp2 to stereo ac3
Code:
#!/bin/bash
# to fix problematic video files

USAGE="Usage: `basename $0` [-v] [-h] [-m] [-t | -a] -f filename
   -v Verbose
   -h This Message
   -m Change Mapping
   -t Transcode to 3800k, 720x576 192k ac3
   -a Transcode Audio Only to 192k ac3
   -f filename"

VERBOSE=false
OUTPUTDEV="/dev/null"
TEST=false
ISMAP=false
USETCODE=false
ACODE=false



ID=false
PARAMETER=" "

while getopts f:vmath OPTION ; do
   case "$OPTION" in
       f)SOURCEFILE="$OPTARG" ;;
       m)ISMAP=true ;;
       t)USETCODE=true ;;
       a)ACODE=true ;;
       v)VERBOSE=true ;;
       h)echo "$USAGE" ;
        exit 1
        ;;
   esac
done

#Now we have arguments and options, we now need to check
#what parameters have been passed and do we need to process them

#Very little preprocessing for input filename, should really put in some file name
#sanity checking

SOURCENAME=${SOURCEFILE}
TEMPNAME=${SOURCEFILE%.mpg}
SOURCEFILE=${TEMPNAME}
TEMPNAME=${SOURCEFILE%.ts}
SOURCEFILE=${TEMPNAME}


#Add the extensions and the temporary file name part
#SOURCENAME=${TEMPNAME}.mpg
#TEMPFILENAME=${TEMPNAME}.tmp.mpg
OPNAME=${SOURCEFILE}_0.mpg

if [ "$ISMAP" = true ] ; then
   MAP1="0:1"
   MAP2="0:0"
else
   MAP1="0:0"
   MAP2="0:1"
fi

if [ "$VERBOSE" = true ] ; then
   echo "SOURCEfile = $SOURCENAME"
   echo "Output file = $OPNAME"
fi

if [ ! -e "$SOURCENAME" ] ; then
   #Check for the existence of the input file
   echo "$SOURCENAME not found."
   exit 1
fi

if [ "$USETCODE" = true ] && [ "$ACODE" = false ] ; then
   echo "Transcoding Sound + Video"
   ffmpeg -threads 2 -v 1 -i "$SOURCENAME" -r pal -target dvd -b 3800k -s 720x576 -acodec ac3 -ab 192k -ac 2 -copyts -aspect 16:9   "$OPNAME" -map $MAP1 -map $MAP2
elif [ "$USETCODE" = false ] && [ "$ACODE" = false ] ; then
   echo "Fixing File"
   ffmpeg -i "$SOURCENAME"  -acodec copy -vcodec copy "$OPNAME"
elif [ "$USETCODE" = false ] && [ "$ACODE" = true ] ; then
   echo "Reencoding Sound"
   ffmpeg -threads 2 -v 1 -i "$SOURCENAME"  -r pal -target dvd -vcodec copy -acodec ac3 -ab 192k -ac 2  "$OPNAME" -map $MAP1 -map $MAP2
fi

if [ $? -ne 0 ]
then
   #either ran out of space or file too damaged.
   echo "ffmpeg failed!"
   exit 1
fi


exit 0


The next is repvid.sh, which calls fixvid in two different modes and then finishes of with calling demuxmux.sh to tidy up the file.

Code:
#!/bin/bash


USAGE="Usage: `basename $0` [-v] [-c] [-h] -f filename
   -v Verbose
   -c Cleanup Intermediate Files
   -m Change Mapping
   -h This Message
   -f filename"

VERBOSE=false
OUTPUTDEV="/dev/null"
TEST=false
ISMAP=false
ISCLEANUP=false


while getopts f:vcmh OPTION ; do
   case "$OPTION" in
       f)SOURCEFILE="$OPTARG" ;;
       v)VERBOSE=true ;;
       m)ISMAP=true ;;
       c)ISCLEANUP=true ;;
       h)echo "$USAGE" ;
        exit 1
        ;;
   esac
done

SOURCENAME=${SOURCEFILE}
TEMPNAME=${SOURCEFILE%.ts}
SOURCEFILE=${TEMPNAME}


OP1NAME=${SOURCEFILE}_0.mpg
IP2NAME=${SOURCEFILE}_f.mpg
OP2NAME=${SOURCEFILE}_f_0.mpg
IP3NAME=${SOURCEFILE}_a.mpg
INTERVID=${SOURCEFILE}_a.m2v
INTERAUD=${SOURCEFILE}_a.ac3
OP3NAME=${SOURCEFILE}_a_1.mpg

OP4NAME=${SOURCEFILE}_1.mpg

if [ "$VERBOSE" = true ] ; then
   echo "SOURCEfile = $SOURCENAME"
   echo "Output file = $OP1NAME"
   echo "Input file  = $IP2NAME"
   echo "Output file = $OP2NAME"
   echo "Input file  = $IP3NAME"
   echo "Output file = $OP3NAME"
   echo "Inter Vid F = $INTERVID"
   echo "Inter Aud F = $INTERAUD"
   echo "Output file = $OP4NAME"
   
fi


if [ ! -e "$SOURCENAME" ] ; then
   #Check for the existence of the input file
   echo "$SOURCENAME not found."
   exit 1
fi


#Do Inital file Fix
echo "Initial File Fix"

~/bin/fixvid.sh -v  -f "$SOURCENAME"

if [ ! -e "$OP1NAME" ] ; then
   #Check for the existence of the input file
   echo "$OP1NAME not found."
   exit 1
fi

if [ "$VERBOSE" = true ] ; then
   echo "Renaming $OP1NAME to $IP2NAME"
   mv -vf "$OP1NAME" "$IP2NAME"
else
   mv -f "$OP1NAME" "$IP2NAME"
fi

if [ $? -ne 0 ]
then
      #check that move completed
      echo "File Moved failed!"
      exit 1
else
      echo "Move OK"
fi


# Reencode Sound to AC3
echo "Reencoding Audio to AC3"

if [ "$ISMAP" = true ] ; then
   ~/bin/fixvid.sh -v -a -m -f "$IP2NAME"
else
   ~/bin/fixvid.sh -v -a -f "$IP2NAME"
fi

if [ ! -e "$OP2NAME" ] ; then
   #Check for the existence of the input file
   echo "$OP2NAME not found."
   exit 1
fi

if [ "$VERBOSE" = true ] ; then
   echo "Renaming $OP2NAME to $IP3NAME"
   mv -vf "$OP2NAME" "$IP3NAME"
else
   mv -f "$OP2NAME" "$IP3NAME"
fi

if [ $? -ne 0 ]
then
      #check that move completed
      echo "File Moved failed!"
      exit 1
else
      echo "Move OK"
fi

echo "Tiding Up File"
   # Demux & Remux File to finally clean it up
   ~/bin/demuxmux.sh -v -o -c   -f "$IP3NAME"

      
if [ ! -e "$OP3NAME" ] ; then
   #Check for the existence of the output file
   echo "$OP3NAME not found."
   exit 1
fi

if [ "$VERBOSE" = true ] ; then
   echo "Renaming $OP3NAME to $OP4NAME"
   mv -vf "$OP3NAME" "$OP4NAME"
else
   mv -f "$OP3NAME" "$OP4NAME"
fi

if [ $? -ne 0 ]
then
      #check that move completed
      echo "File Moved failed!"
      exit 1
else
      echo "Move OK"
fi

if [ "$ISCLEANUP" = true ] ; then
   if [ "$VERBOSE" = true ] ; then
      echo "Cleaning up Files..."
      rm -v "$IP2NAME"
      rm -v "$IP3NAME"
      rm -v "$INTERVID"
      rm -v "$INTERAUD"
   else
      echo "Cleaning up Files..."
      rm "$IP2NAME"
      rm "$IP3NAME"
      rm "$INTERVID"
      rm "$INTERAUD"
   fi
fi



The final one is just a script to cycle through the files to be fixed:

Code:
#!/bin/bash

for list in  *.ts; do
   echo "File is $list"

   #Do Inital file Fix
   ~/bin/repvid.sh -v -c -f $list
      
   fi
done


Of course, these will have to be modified for a particular workstation, but hope they might be useful for someone.

HTH Bruce S.

_________________
Updated 2019/10/26: AthlonII X2 265 Gigabyte GA-970A-DS3P
16Gb PC 1866 DDR3, 500GB+2TB+4TB SATA HDD,
SATA DVD-RW Asus DRW-24D5MT , NVIDIA GeForce GT1080
Hauppauage Nova-T 500, Nova-T LinHes R8.6.1


Top
 Profile  
 

Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 


All times are UTC - 6 hours




Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group

Theme Created By ceyhansuyu