Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #Close stdin - avoid accidental key presses causing problems
  4. exec 0>&-
  5.  
  6. # Find MKV files
  7. for file in "$@";
  8. do
  9. find "$file" -type f -not -name ".*" | grep .mkv$ | while read file
  10. do
  11. fileProper=$(readlink -f "$file") # full path of file
  12. pathNoExt=${fileProper%.*} # full path minus extension
  13.  
  14. #Check if M4V already exists
  15. if [ -f "$pathNoExt".m4v ]; then
  16. echo "M4V already exists, stopping"
  17. else
  18. # Get number of tracks
  19. numberOfTracks=`mkvmerge -i "$fileProper" | grep "Track ID" | wc -l`
  20. echo "Found $numberOfTracks Tracks"
  21.  
  22. # Set base extraction command
  23. extractCmd+=(mkvextract tracks "$fileProper")
  24.  
  25. # Determine type of tracks
  26. for (( i=1; i<=$numberOfTracks; i++ ))
  27. do
  28. trackType=`mkvmerge -i "$fileProper" | grep "Track ID $i" | sed -e 's/^.*: //'`
  29. if [[ "$trackType" == *video* ]]; then
  30. echo "Track $i is Video"
  31. extractCmd+=( $i:"$pathNoExt".264)
  32. fps=`mkvinfo "$fileProper" | grep duration | sed -e 's/.*(//' -e 's/f.*//' | sed -n ${i}p`
  33. elif [[ "$trackType" == "audio (A_AAC)" ]]; then
  34. echo "Track $i is AAC"
  35. extractCmd+=( $i:"$pathNoExt".aac)
  36. elif [[ "$trackType" == "audio (A_AC3)" ]]; then
  37. echo "Track $i is AC3"
  38. extractCmd+=( $i:"$pathNoExt".ac3)
  39. elif [[ "$trackType" == "audio (A_DTS)" ]]; then
  40. echo "Track $i is DTS"
  41. extractCmd+=( $i:"$pathNoExt".dts)
  42. fi
  43. # Insert cases for handling other audio and non-AV tracks here
  44. done
  45.  
  46. "${extractCmd[@]}" # Extract Tracks
  47.  
  48. # Check files and encode audio if necessary
  49. if [ -f "$pathNoExt".264 ]; then
  50. # Video file exists
  51. mp4BoxCmd+=(MP4Box -new "$pathNoExt".m4v -add "$pathNoExt".264 -fps $fps)
  52. if [ -f "$pathNoExt".aac ]; then
  53. # AAC exists
  54. mp4BoxCmd+=( -add "$pathNoExt".aac)
  55. if [ -f "$pathNoExt".ac3 ]; then
  56. mp4BoxCmd+=( -add "$pathNoExt".ac3:disable)
  57. elif [ -f "$pathNoExt".dts ]; then
  58. # Encode DTS to AC3
  59. dcadec -o wavall "$pathNoExt".dts | aften -v 0 - "$pathNoExt".ac3
  60. mp4BoxCmd+=( -add "$pathNoExt".ac3:disable)
  61. fi
  62. else # Encode AAC from AC3 or DTS
  63. if [ -f "$pathNoExt".ac3 ]; then
  64. ffmpeg -i "$pathNoExt".ac3 -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -lc -br 160000 -ignorelength -if - -of "$pathNoExt".aac
  65. mp4BoxCmd+=( -add "$pathNoExt".aac -add "$pathNoExt".ac3:disable)
  66. elif [ -f "$pathNoExt".dts ]; then
  67. ffmpeg -i "$pathNoExt".dts -acodec pcm_s16le -ac 2 -f wav - | neroAacEnc -lc -br 160000 -ignorelength -if - -of "$pathNoExt".aac
  68. # Encode DTS to AC3
  69. dcadec -o wavall "$pathNoExt".dts | aften -v 0 - "$pathNoExt".ac3
  70. mp4BoxCmd+=( -add "$pathNoExt".aac -add "$pathNoExt".ac3:disable)
  71. else
  72. echo "Warning: no audio file found"
  73. fi
  74. fi
  75. # Create m4v
  76. "${mp4BoxCmd[@]}"
  77. else
  78. echo "Error: no video file found"
  79. fi
  80. #remove temporary track files
  81. rm -f "$pathNoExt".aac "$pathNoExt".dts "$pathNoExt".ac3 "$pathNoExt".264 "$pathNoExt".wav
  82. fi
  83. done
  84. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement