Differences
This shows you the differences between two versions of the page.
Previous revision | |||
— | linux_faq:bash_script_to_batch_convert_video_files_to_h265 [2019/11/15 13:00] (current) – [Описание скрипта] admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== to do ====== | ||
+ | 1. добавить вывод даты/ | ||
+ | |||
+ | 3. Сделать проверку/ | ||
+ | ffprobe videofile.avi -v error -select_streams 0 -show_entries stream=duration | ||
+ | 4. Сделать проверку и исправление исходного файла, в случае, | ||
+ | 5.Сделать автоматическое определение необходимого уровня качества, | ||
+ | ====== Для чего ====== | ||
+ | Мне захотелось оптимизировать свой видеоархив при помощи кодека **h265**, который позволяет существенно сэкономить место на диске практически без потери качества видеоматериалов. \\ | ||
+ | |||
+ | ====== Применяемые средства ====== | ||
+ | Для конвертации я буду использовать **HandBrakeCLI** под **Ubuntu 16.04**. \\ | ||
+ | Устанавливать **HandBrakeCLI** лучше из [[https:// | ||
+ | Также понадобится **ffmpeg** для определения кодека (чтобы повторно не конвертировать файлы уже сконвертированные в **h265**) и работы с данными **EXIF**. | ||
+ | sudo add-apt-repository ppa: | ||
+ | sudo apt-get update | ||
+ | sudo apt-get install handbrake-cli ffmpeg | ||
+ | |||
+ | ====== Описание скрипта ====== | ||
+ | Скрипт адаптирован к именам файлов и папок, содержащим пробелы. \\ | ||
+ | Скрипт формирует список файлов в папке и вложенных папках по типу **MIME** - **video**. \\ | ||
+ | Затем, у каждого файла проверяется текущий видеокодек и если он не **HEVC (h265)**, то файл проверяется на наличие ошибок и если все все хорошо - конвертируется. Конвертированный | ||
+ | После конвертации в файле меняется значение **EXIF**-аттрибута **creation_date** на значение извлеченное из оригинального файла. \\ | ||
+ | В качестве бонуса подсчитывается количество сэкономленного места. \\ | ||
+ | Для работы нужно задать параметры - папку с исходными файлами, | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | |||
+ | srcdir="/ | ||
+ | oldfilesdir=`dirname " | ||
+ | filelist=`find $srcdir -type f -exec file -N -i -- {} + | sed -n 's!: video/ | ||
+ | logfile=$oldfilesdir/ | ||
+ | threads=3 | ||
+ | quality=30 | ||
+ | |||
+ | mkdir $oldfilesdir | ||
+ | oldsize=0; newsize=0; filesleft=0; | ||
+ | filesleft=`echo " | ||
+ | echo $filesleft "video files detected" | ||
+ | while read -r file | ||
+ | do | ||
+ | echo "FILE - $file" | tee -a $logfile | ||
+ | echo " | ||
+ | if [ $? -eq 0 ]; then echo "This File is already in HEVC (h265)" | ||
+ | else | ||
+ | echo " | ||
+ | echo " | ||
+ | if [ $? -ne 0 ]; then echo "File corrupted. Skipping..." | ||
+ | else | ||
+ | filedir=`dirname " | ||
+ | filesize=`du -k " | ||
+ | filename=`basename " | ||
+ | creationtime=`echo " | ||
+ | oldsize=$(( oldsize + filesize )) | ||
+ | mkdir --parents " | ||
+ | mv " | ||
+ | echo " | ||
+ | --custom-anamorphic --keep-display-aspect -O -x threads=$threads 2> / | ||
+ | handbrakereturn=$? | ||
+ | if [ " | ||
+ | then echo " | ||
+ | if [ " | ||
+ | then echo " | ||
+ | echo " | ||
+ | -metadata: | ||
+ | -c copy \" | ||
+ | if [ $? -eq 0 ]; then echo " | ||
+ | mv " | ||
+ | else echo " | ||
+ | fi | ||
+ | else echo " | ||
+ | mv " | ||
+ | fi | ||
+ | sync | ||
+ | filesize=`du -k " | ||
+ | newsize=$(( newsize + filesize )) | ||
+ | fi | ||
+ | fi | ||
+ | (( filesleft-- )) | ||
+ | echo $filesleft "files left to convert" | ||
+ | done < <(echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo "Saved Space - $(( $oldsize - $newsize )) Kb" | tee -a $logfile | ||
+ | echo " | ||
+ | </ | ||
+ | |||
+ | Вот вариант, | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | |||
+ | srcdir=/ | ||
+ | # | ||
+ | filelist=`find $srcdir -type f -exec file -N -i -- {} + | sed -n 's!: video/ | ||
+ | logfile=$srcdir/ | ||
+ | threads=3 | ||
+ | |||
+ | #mkdir $oldfilesdir | ||
+ | oldsize=0; newsize=0; filesleft=0; | ||
+ | filesleft=`echo " | ||
+ | echo $filesleft "video files detected" | ||
+ | while read -r file | ||
+ | do | ||
+ | echo "FILE - $file" | tee -a $logfile | ||
+ | echo " | ||
+ | if [ $? -eq 0 ]; then echo "This File is already in HEVC (h265)" | ||
+ | else | ||
+ | echo " | ||
+ | echo " | ||
+ | if [ $? -ne 0 ]; then echo "File corrupted. Skipping..." | ||
+ | else | ||
+ | filedir=`dirname " | ||
+ | filesize=`du -k " | ||
+ | filename=`basename " | ||
+ | creationtime=`echo " | ||
+ | oldsize=$(( oldsize + filesize )) | ||
+ | echo " | ||
+ | mv " | ||
+ | echo " | ||
+ | --custom-anamorphic --keep-display-aspect -O -x threads=$threads 4> / | ||
+ | handbrakereturn=$? | ||
+ | if [ " | ||
+ | then echo " | ||
+ | rm -f " | ||
+ | if [ " | ||
+ | file_extension=" | ||
+ | new_date_file=" | ||
+ | then echo " | ||
+ | preservation_time_cmd=" | ||
+ | -metadata: | ||
+ | -c copy \" | ||
+ | echo $preservation_time_cmd | /bin/bash | ||
+ | if [ $? -eq 0 ]; then echo " | ||
+ | else echo " | ||
+ | fi | ||
+ | else | ||
+ | echo " | ||
+ | mv " | ||
+ | fi | ||
+ | sync | ||
+ | filesize=`du -k " | ||
+ | newsize=$(( newsize + filesize )) | ||
+ | fi | ||
+ | fi | ||
+ | (( filesleft-- )) | ||
+ | echo $filesleft "files left to convert" | ||
+ | done < <(echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo "Saved Space - $(( $oldsize - $newsize )) Kb" | tee -a $logfile | ||
+ | echo " | ||
+ | </ | ||