2015-04-12 4 views
-1

У меня есть мое хранилище VPS, заполненное видео, и надеюсь, что я смогу освободить место, их разрешение довольно большое поэтому я решил повторно кодировать их с FFmpeg на меньшее разрешение, я делаю все, что вручную, сначала проверяю с помощью mediainfo test5.mkv разрешенияпроверить разрешение мультимедиа, если разрешение велико ffmpeg, если выход меньше оригинала, удалите оригинал, иначе удалите вывод

... 
Width         : 1 280 pixels 
... 

если ширина больше, чем 720 pixels я выполняю следующую команду:

ffmpeg -i 'test5.mkv' -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow '[Encoded] test5.mkv' 

, после чего я удаляю исходное видео, если результат имеет меньший размер, чем исходный.

Я надеюсь, что есть сценарий, который может автоматизировать это, так как я буду работать в каталоге, тогда он будет искать все .mkv подкаталоги рекурсивно выполнять эти проверки и действия. Как это сделать?

Кроме того, я обеспокоен тем, что он может выйти из строя, если я дойду до автоматизации, так как в названии видео есть специальные символы, такие как одиночные кавычки, двойные кавычки или `, поэтому я могу его избежать.

Спасибо!

После некоторого гугле я оказался в следующем фрагменте кода, я беспокоюсь, если этого достаточно, но я боюсь, чтобы запустить его, так как я не уверен, если это может повредить мой UNIX

#!/bin/sh 

for file in *.{mkv}; do 
target="[720p]-${file%.*}.mkv" 
[[ -f "$target" ]] && { echo "skipping $file - $target exists" ; continue; } 


eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$file") 
size=${streams_stream_0_width}x${streams_stream_0_height} 
if [ "$streams_stream_0_width" -ge 720 ]; then 
echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target" 

fi 
done 

может кто-нибудь, пожалуйста, скажите мне, должен ли мой отрывок работать?

UPDATE

как выясняется if [ "$streams_stream_0_width" -ge 720 ]; then терпит неудачу, потому что ширина не целое число? line 10: [: : integer expression expected Я не уверен, почему это не целое число, как я могу сделать его целым?

ответ

0

Я предполагаю, что существует больше кода, который устанавливает значение для ${streams_stream_0_width} и ${streams_stream_0_height}. Если нет, ваш код не будет знать значение для этих переменных и не получится.

Но, вы теряете 2 вещи, как может быть решен с помощью синтаксиса оболочки арифметической подстановки

size=$((${streams_stream_0_width} * ${streams_stream_0_height})) 
if (("$streams_stream_0_width" > 720)); then 
    echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target" 
fi 

Обратите внимание, что для умножения, можно использовать стандартный * оператор, а не x характера.

Двойные ((...)) круглые скобки дать вам арифметических оценок и вы можете использовать большинство функций c языка, как x++, x+=12, x--, а также операторы сравнения, как <, >, <=, >=.

И с ведущим $, у вас есть возможность командной подстановки, что делает одни и те же арифметические оценки, как result=$((...))

Как у меня нет доступа к файлам, которые вы используете, у меня нет простой способ проверить вашу команду на ffmpeg.

Наконец, внутри ((...)) и $((...)) вам не нужно использовать $ в передней части имен переменных, поэтому код может быть дополнительно упрощена

size=$((streams_stream_0_width * streams_stream_0_height)) 
if ((streams_stream_0_width > 720)); then 
    echo ffmpeg -i "$file" -vf scale=720:-2 -acodec copy -vcodec libx264 -scodec copy -threads 12 -crf 28 -x264-params keyint=240:min-keyint=20 -preset:v slow "$target" 
fi 

IHTH

Смежные вопросы