Advertisement
Guest User

Untitled

a guest
Aug 19th, 2012
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2.  
  3. ################################################################################
  4. #
  5. # Script name: MultiMedia Concat Script (mmcat)
  6. # Author: burek (burek021@gmail.com)
  7. # License: GNU/GPL, see http://www.gnu.org/copyleft/gpl.html
  8. # Date: 2012-07-14
  9. #
  10. # This script concatenates (joins, merges) several audio/video inputs into one
  11. # final output (just like as if all the inputs were played in a playlist, one
  12. # after another).
  13. #
  14. # All input files must have at least one audio and at least one video stream.
  15. # If not, you can easily add audio silence, using FFmpeg. Just search the
  16. # internet for "ffmpeg add silence".
  17. #
  18. # The script makes use of FFmpeg tool (www.ffmpeg.org) and is free for use under
  19. # the GPL license. The inspiration for this script came from this FAQ item:
  20. # http://ffmpeg.org/faq.html#How-can-I-join-video-files_003f
  21. #
  22. # If you find any bugs, please send me an e-mail so I can fix it.
  23. #
  24. ################################################################################
  25. #
  26. # General syntax: mmcat <input1> <input2> <input3> ... <output>
  27. #
  28. # For example: mmcat file1.flv file2.flv output.flv
  29. # would create "output.flv" out of "file1.flv" and "file2.flv".
  30. #
  31. ################################################################################
  32.  
  33. # change this to what you need !!!
  34. EXTRA_OPTIONS='-vcodec libx264 -crf 23 -preset medium -acodec aac -strict experimental -ac 2 -ar 44100 -ab 128k'
  35.  
  36. ################################################################################
  37. #
  38. # NO NEED TO TOUCH ANYTHING AFTER THIS LINE!
  39. #
  40. ################################################################################
  41.  
  42. # the version of the script
  43. VERSION=1.2
  44.  
  45. # location of temp folder
  46. TMP=/tmp
  47.  
  48. ################################################################################
  49.  
  50. echo "MultiMedia Concat Script v$VERSION (mmcat) - A script to concatenate multiple multimedia files."
  51. echo "Based on FFmpeg - www.ffmpeg.org"
  52. echo "Don't forget to edit this script and change EXTRA_OPTIONS"
  53. echo ""
  54.  
  55. ################################################################################
  56. # syntax check (has to have at least 3 params: infile1, infile2, outfile
  57. ################################################################################
  58. if [ -z $3 ]; then
  59. echo "Syntax: $0 <input1> <input2> <input3> ... <output>"
  60. exit 1
  61. fi
  62.  
  63. ################################################################################
  64. # get all the command line parameters, except for the last one, which is output
  65. ################################################################################
  66. # $first - first parameter
  67. # $last - last parameter (output file)
  68. # $inputs - all the inputs, except the first input, because 1st input is
  69. # handled separately
  70. ################################################################################
  71. first=${@:1:1}
  72. last=${@:$#:1}
  73. len=$(($#-2))
  74. inputs=${@:2:$len}
  75.  
  76. # remove all previous tmp fifos (if exist)
  77. rm -f $TMP/mcs_*
  78.  
  79. ################################################################################
  80. # decode first input differently, because the video header does not have to be
  81. # kept for each video input, only the header from the first video is needed
  82. ################################################################################
  83. mkfifo $TMP/mcs_a1 $TMP/mcs_v1
  84. ffmpeg -y -i $first\
  85. -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a1\
  86. -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1\
  87. </dev/null 2>$TMP/mcs_log_1 &
  88.  
  89. ################################################################################
  90. # decode all the other inputs, remove first line of video (header) with tail
  91. # $all_a and $all_v are lists of all a/v fifos, to be used by "cat" later on
  92. ################################################################################
  93. all_a=$TMP/mcs_a1
  94. all_v=$TMP/mcs_v1
  95. i=2
  96. for f in $inputs
  97. do
  98. mkfifo $TMP/mcs_a$i $TMP/mcs_v$i $TMP/mcs_t$i
  99. ffmpeg -y -i $f \
  100. -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a$i\
  101. -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_t$i\
  102. </dev/null 2>$TMP/mcs_log_$i &
  103. tail $TMP/mcs_t$i -n +2 > $TMP/mcs_v$i &
  104. all_a="$all_a $TMP/mcs_a$i"
  105. all_v="$all_v $TMP/mcs_v$i"
  106. let i++
  107. done
  108.  
  109. ################################################################################
  110. # concatenate all raw audio/video inputs into one audio/video
  111. ################################################################################
  112. mkfifo $TMP/mcs_a_all
  113. mkfifo $TMP/mcs_v_all
  114. cat $all_a > $TMP/mcs_a_all &
  115. cat $all_v > $TMP/mcs_v_all &
  116.  
  117. ################################################################################
  118. # finally, encode the raw concatenated audio/video into something useful
  119. ################################################################################
  120. ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i $TMP/mcs_a_all \
  121. -f yuv4mpegpipe -vcodec rawvideo -i $TMP/mcs_v_all \
  122. $EXTRA_OPTIONS \
  123. $last\
  124. 2>$TMP/mcs_log_output
  125.  
  126. ################################################################################
  127. # remove all fifos
  128. ################################################################################
  129. rm -f $TMP/mcs_*
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement