Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #Close stdin - avoid accidental key presses causing problems
- exec 0>&-
- # Find MKV files
- for file in "$@";
- do
- find "$file" -type f -not -name ".*" | grep .mkv$ | while read file
- do
- fileProper=$(readlink -f "$file") # full path of file
- pathNoExt=${fileProper%.*} # full path minus extension
- #Check if M4V already exists
- if [ -f "$pathNoExt".m4v ]; then
- echo "M4V already exists, stopping"
- else
- # Get number of tracks
- numberOfTracks=`mkvmerge -i "$fileProper" | grep "Track ID" | wc -l`
- echo "Found $numberOfTracks Tracks"
- # Set base extraction command
- extractCmd+=(mkvextract tracks "$fileProper")
- # Determine type of tracks
- for (( i=1; i<=$numberOfTracks; i++ ))
- do
- trackType=`mkvmerge -i "$fileProper" | grep "Track ID $i" | sed -e 's/^.*: //'`
- if [[ "$trackType" == *video* ]]; then
- echo "Track $i is Video"
- extractCmd+=( $i:"$pathNoExt".264)
- fps=`mkvinfo "$fileProper" | grep duration | sed -e 's/.*(//' -e 's/f.*//' | sed -n ${i}p`
- elif [[ "$trackType" == "audio (A_AAC)" ]]; then
- echo "Track $i is AAC"
- extractCmd+=( $i:"$pathNoExt".aac)
- elif [[ "$trackType" == "audio (A_AC3)" ]]; then
- echo "Track $i is AC3"
- extractCmd+=( $i:"$pathNoExt".ac3)
- elif [[ "$trackType" == "audio (A_DTS)" ]]; then
- echo "Track $i is DTS"
- extractCmd+=( $i:"$pathNoExt".dts)
- fi
- # Insert cases for handling other audio and non-AV tracks here
- done
- "${extractCmd[@]}" # Extract Tracks
- # Check files and encode audio if necessary
- if [ -f "$pathNoExt".264 ]; then
- # Video file exists
- mp4BoxCmd+=(MP4Box -new "$pathNoExt".m4v -add "$pathNoExt".264 -fps $fps)
- if [ -f "$pathNoExt".aac ]; then
- # AAC exists
- mp4BoxCmd+=( -add "$pathNoExt".aac)
- if [ -f "$pathNoExt".ac3 ]; then
- mp4BoxCmd+=( -add "$pathNoExt".ac3:disable)
- elif [ -f "$pathNoExt".dts ]; then
- # Encode DTS to AC3
- dcadec -o wavall "$pathNoExt".dts | aften -v 0 - "$pathNoExt".ac3
- mp4BoxCmd+=( -add "$pathNoExt".ac3:disable)
- fi
- else # Encode AAC from AC3 or DTS
- if [ -f "$pathNoExt".ac3 ]; then
- ffmpeg -i "$pathNoExt".ac3 -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -lc -br 160000 -ignorelength -if - -of "$pathNoExt".aac
- mp4BoxCmd+=( -add "$pathNoExt".aac -add "$pathNoExt".ac3:disable)
- elif [ -f "$pathNoExt".dts ]; then
- ffmpeg -i "$pathNoExt".dts -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -lc -br 160000 -ignorelength -if - -of "$pathNoExt".aac
- # Encode DTS to AC3
- dcadec -o wavall "$pathNoExt".dts | aften -v 0 - "$pathNoExt".ac3
- mp4BoxCmd+=( -add "$pathNoExt".aac -add "$pathNoExt".ac3:disable)
- else
- echo "Warning: no audio file found"
- fi
- fi
- # Create m4v
- "${mp4BoxCmd[@]}"
- else
- echo "Error: no video file found"
- fi
- #remove temporary track files
- rm -f "$pathNoExt".aac "$pathNoExt".dts "$pathNoExt".ac3 "$pathNoExt".264 "$pathNoExt".wav
- fi
- done
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement