mp4encode
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #!/bin/sh
  2. # mp4encode <avi-file>
  3. # Initialize default values for options
  4. convertRgb=0
  5. videoWidth=320
  6. videoHeight=240
  7. fps=24
  8. aspectRatio=1.33 # 4:3 standard definition TV aspect ratio
  9. use_iso=0
  10. vbitRate=500
  11. use_mp3=0
  12. abitRate=96
  13. debug=0
  14. # Process command line options
  15. while getopts "A:IMRV:a:dh:r:w:" opt; do
  16. case $opt in
  17. A ) abitRate=$OPTARG ;;
  18. I ) use_iso=1 ;;
  19. M ) use_mp3=1 ;;
  20. R ) convertRgb=1 ;;
  21. V ) vbitRate=$OPTARG ;;
  22. a ) aspectRatio=$OPTARG ;;
  23. d ) debug=1 ;;
  24. h ) videoHeight=$OPTARG ;;
  25. r ) fps=$OPTARG ;;
  26. w ) videoWidth=$OPTARG ;;
  27. ? ) echo "usage: $0 [-w width] [-h height] [-r fps] [-a ratio] [-I] [-V kbps] [-M] [-A kbps] [-d] avifile [mp4file]"
  28. exit 1 ;;
  29. esac
  30. done
  31. shift `expr $OPTIND - 1`
  32. if [ $debug = 1 ]; then
  33. set -x
  34. fi
  35. # The name of the AVI input file
  36. avifile=$1
  37. prefix=`expr $avifile : '(.*).avi'`
  38. # The name of the MP4 output file
  39. if [ -n "$2" ] ; then
  40. mp4file=$2
  41. else
  42. mp4file=${prefix}.mp4
  43. fi
  44. # Check that the input AVI file exists
  45. if [ ! -f "$avifile" ] ; then
  46. echo "Input file $avifile does not exist"
  47. exit 2
  48. fi
  49. # A few more initializations
  50. rawframesize=`expr ${videoWidth} * ${videoHeight} * 3 / 2`
  51. here=`pwd`
  52. # For Divx encoder, this generates 1 I frame every two seconds
  53. ifrequency=`expr $fps * 2`
  54. if [ $use_iso = 1 ]; then 
  55. # For ISO encoder, these default values 
  56. # yield I P B B P B B ... for every 1 second period
  57. bfrequency=2
  58. pfrequency=`expr ( $fps / ( $bfrequency + 1 ) ) - 1`
  59. fi
  60. # Create output directories for ISO video encoder if necessary
  61. if [ $use_iso = 1 ]; then 
  62. if [ ! -d mp4vout ]; then
  63. mkdir mp4vout
  64. fi
  65. if [ ! -d yuvout ]; then
  66. mkdir yuvout
  67. fi
  68. fi
  69. date
  70. echo "Starting encode of ${mp4file}"
  71. if [ ! -f $prefix.yuv ] || [ $prefix.avi -nt $prefix.yuv ]; then
  72. echo "Extracting video from avi"
  73. tmpfile=./.tmp$$
  74. avi2raw -v $prefix.avi $prefix.yuv > $tmpfile
  75. # Convert from RGB24 to YUV12 if desired
  76. if [ $convertRgb = 1 ]; then
  77. mv $prefix.yuv $prefix.rgb
  78. echo "Converting video from RGB24 to YUV12"
  79. rgb2yuv -w $videoWidth -h $videoHeight $prefix.rgb $prefix.yuv
  80. fi
  81. # Perform simple check that we do indeed have raw YUV12 video
  82. numframes=`awk '{print $1}' $tmpfile`
  83. targetbytes=`expr ${numframes} * ${rawframesize}`
  84. numbytes=`wc -c < ${prefix}.yuv`
  85. rm -f ${tmpfile}
  86. if [ $targetbytes != $numbytes ]; then
  87. echo "Extracted video isn't correct size for YUV12 ${videoWidth}x${videoHeight}"
  88. echo "Please check specified video frame size and YUV12 format"
  89. exit 2
  90. fi 
  91. # Crop video if desired
  92. if [ $aspectRatio != 1.33 ] ; then
  93. echo "Cropping video to ${aspectRatio}:1"
  94. lboxcrop -w ${videoWidth} -h ${videoHeight} -a ${aspectRatio} ${prefix}.yuv ${prefix}_crop.yuv
  95. mv ${prefix}_crop.yuv ${prefix}.yuv
  96. fi
  97. fi
  98. if [ $aspectRatio != 1.33 ] ; then
  99. videoHeight=`dc -e"$videoWidth $aspectRatio / p"`
  100. temp=`dc -e"$videoHeight 16 % p"`
  101. if [ $temp != 0 ] ; then
  102. videoHeight=`dc -e"16 $temp - $videoHeight + p"`
  103. fi
  104. fi
  105. numbytes=`wc -c < ${prefix}.yuv`
  106. numframes=`expr ${numbytes} / ${rawframesize}`
  107. lastframe=`expr ${numframes} - 1`
  108. echo "Encoding ${numframes} frames of video"
  109. if [ $use_iso = 0 ]; then 
  110. vfile=${prefix}.divx
  111. xvidenc -b ${vbitRate} -h ${videoHeight} -w ${videoWidth} -r ${fps} -i ${ifrequency} ${prefix}.yuv ${vfile}
  112. else
  113. # Create video encoder parameters file from template
  114. isoBitRate=`expr ${vbitRate} * 100000`
  115. sed -e "s?BASEDIR?${here}?" -e "s/FILEPREFIX/${prefix}/" -e "s/LASTFRAME/${lastframe}/" -e "s/FRAMEWIDTH/${videoWidth}/" -e "s/FRAMEHEIGHT/${videoHeight}/" -e "s/FRAMERATE/${fps}/" -e "s/BFREQUENCY/${bfrequency}/" -e "s/PFREQUENCY/${pfrequency}/" -e "s/BITRATE/${isoBitRate}/" /usr/local/share/mp4venc_template.par > ${prefix}.par 
  116. mp4venc ${prefix}.par
  117. vfile=${prefix}.cmp
  118. mv ./mp4vout/01/${vfile} ./${vfile}
  119. rm ./yuvout/01/${prefix}.yuv
  120. fi
  121. if [ $debug = 0 ]; then
  122. rm -f ${prefix}.yuv
  123. fi
  124. echo "Finished encoding video"
  125. if [ ! -f $prefix.pcm ] || [ $prefix.avi -nt $prefix.pcm ]; then
  126. echo "Splitting out audio from avi"
  127. avi2raw -a ${prefix}.avi ${prefix}.pcm
  128. fi
  129. echo "Encoding audio"
  130. if [ $use_mp3 = 0 ]; then 
  131. afile=${prefix}.aac
  132. faac -r -m4 -pLC -b${abitRate} ${prefix}.pcm ${afile}
  133. else
  134. afile=${prefix}.mp3
  135. lame -r -x -h -b ${abitRate} ${prefix}.pcm ${afile}
  136. fi
  137. if [ $debug = 0 ]; then
  138. rm -f ${prefix}.pcm
  139. fi
  140. rm -f ${mp4file}
  141. echo "Creating mp4 file with video"
  142. mp4creator -c ${vfile} -rate=${fps} -H ${mp4file}
  143. if [ $debug = 0 ]; then
  144. rm -f ${vfile}
  145. fi
  146. echo "Merging audio with video in mp4 file"
  147. mp4creator -c ${afile} -H -O ${mp4file}
  148. if [ $debug = 0 ]; then
  149. rm -f ${afile}
  150. fi
  151. if [ $debug = 1 ]; then
  152. set +o xtrace
  153. fi
  154. date
  155. echo "Finished, results are in ${mp4file}"