fork download
  1. for arg in "$@"; do
  2.  
  3. key=$(echo $arg | cut -f1 -d=)
  4. value=$(echo $arg | cut -f2 -d=)
  5.  
  6. case "$key" in
  7.  
  8. -i | --inputfile)
  9. if [ "${value}" = "-i" ]; then
  10. inputfile=""
  11. else
  12. inputfile="$(echo -e "${value}" | tr -d '[:space:]')"
  13. fi
  14. ;;
  15.  
  16. -o | --outputfolder)
  17. if [ "${value}" = "-o" ]; then
  18. outputfolder=""
  19. else
  20. outputfolder="$(echo -e "${value}" | tr -d '[:space:]')"
  21. fi
  22. ;;
  23.  
  24. -h)
  25. echo $'\n'
  26. echo " Script to convert mp4 into adaptive or hls stream(\"*.m3u8\")"
  27. echo $'\n'
  28. echo " Arguments"
  29. echo ''
  30. echo " Argument Name Type Details"
  31. echo ''
  32. echo " -i | --inputfile REQUIRED Input File Location(only \".mp4\" supported)"
  33. echo " -o | --outputfolder NOT REQUIRED Output Folder Location(default to \"inputfile_output\")"
  34. echo $'\n'
  35. exit 0
  36. ;;
  37.  
  38. *) ;;
  39.  
  40. esac
  41.  
  42. done
  43.  
  44. if [ "${inputfile}" = "" ]; then
  45. echo "Input file is required as an argument. Use -i or --inputfile to provide it."
  46. exit 1
  47. elif [ ! -f "${inputfile}" ]; then
  48. echo "File ${inputfile} does not exists"
  49. exit 1
  50. fi
  51.  
  52. file=$(basename -- "${inputfile}")
  53.  
  54. extension="${file##*.}"
  55.  
  56. filename="${file%.*}"
  57.  
  58. if [ "${extension}" != "mp4" ]; then
  59. echo "Only mp4 files are allowed"
  60. exit 1
  61. fi
  62.  
  63. os="$(uname -s)"
  64. case "${os}" in
  65. Linux*)
  66. echo $(dpkg-query -W -f'${Status}' "$pkg" 2>/dev/null | grep -q "ok installed" || sudo apt install ffmpeg)
  67. ;;
  68. Darwin*)
  69. echo $(brew list ffmpeg &>/dev/null || brew install ffmpeg)
  70. ;;
  71. *)
  72. echo "ffmpeg needs to be installed for this to work"
  73. ;;
  74. esac
  75.  
  76. if [ ! -d ${outputfolder} ] || [ "${outputfolder}" = "" ]; then
  77. outputfolder="${filename}_output"
  78. echo $(mkdir "${outputfolder}")
  79. fi
  80.  
  81. ffmpeg -i "${inputfile}" \
  82. -filter_complex \
  83. "[0:v]split=4[v1][v2][v3][v4]; \
  84. [v1]scale=w=1920:h=1080[v1out]; \
  85. [v2]scale=w=1280:h=720[v2out]; \
  86. [v3]scale=w=854:h=480[v3out]; \
  87. [v4]scale=w=640:h=360[v4out]" \
  88. \
  89. -map [v1out] -c:v:0 libx264 -x264-params \
  90. "nal-hrd=cbr:force-cfr=1" -b:v:0 10M -maxrate:v:0 10M -minrate:v:0 10M \
  91. -bufsize:v:0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
  92. \
  93. -map [v2out] -c:v:1 libx264 -x264-params \
  94. "nal-hrd=cbr:force-cfr=1" -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M \
  95. -bufsize:v:0 5M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
  96. \
  97. -map [v3out] -c:v:2 libx264 -x264-params \
  98. "nal-hrd=cbr:force-cfr=1" -b:v:0 3M -maxrate:v:0 3M -minrate:v:0 3M \
  99. -bufsize:v:0 3M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
  100. \
  101. -map [v4out] -c:v:3 libx264 -x264-params \
  102. "nal-hrd=cbr:force-cfr=1" -b:v:0 1M -maxrate:v:0 1M -minrate:v:0 1M \
  103. -bufsize:v:0 1M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 \
  104. \
  105. -map a:0 -c:a:0 aac -b:a:0 96k -ac 2 \
  106. -map a:0 -c:a:1 aac -b:a:1 96k -ac 2 \
  107. -map a:0 -c:a:2 aac -b:a:2 48k -ac 2 \
  108. -map a:0 -c:a:3 aac -b:a:3 48k -ac 2 \
  109. \
  110. -f hls \
  111. -hls_time 2 \
  112. -hls_playlist_type vod \
  113. -hls_flags independent_segments \
  114. -hls_segment_type mpegts \
  115. -hls_segment_filename "${outputfolder}/${filename}_%v/data%04d.ts" \
  116. \
  117. -master_pl_name "${filename}.m3u8" \
  118. -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3" "${outputfolder}/${filename}_%v.m3u8"
Runtime error #stdin #stdout 0.01s 5380KB
stdin
Standard input is empty
stdout
Input file is required as an argument. Use -i or --inputfile to provide it.