Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision | |||
| linux_faq:bash_script_to_batch_convert_video_files_to_h265 [2019/07/30 18:33] – 0 admin | 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 " | ||
| + | </ | ||