Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: bash скрипт для перекодирования видео, подскажите где ошибка?  (Прочитано 1782 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gektor-m

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Если в команде ffmpeg добавить ошибочный ключик, то скрипт выполняется столько раз, сколько файлов в каталоге, иначе ffmpeg обрабатывает один файл и завершает скрипт.
#!/bin/bash
VAR="files.txt"
ls *.mpg | sort > $VAR # Collect the files in the current directory
cat $VAR | while read line
do  # Loop read the filenames from the file
  INPUT=$(echo ${line}); # Grab the nxt new filename
  OUTPUT=$INPUT; # Remove shortest match of characters between the '. ' and the '4' at end of string
  OUTPUT+=".mp4"; # Append new extension
  ffmpeg -i "$INPUT" -vcodec libx264 -b 2000k -aspect 16:9 -bf 3 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method hex -subq 5 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 1 -flags2 +fastpskip -dts_delta_threshold 1 -acodec libfaac -ab 44100 "$OUTPUT"
done
подскажите пожалуйста что не так?

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
А не проще ли это сделать как то так:
#!/bin/bash
for i in `ls ./ | grep .mpg`
do
start_name=`echo $i | sed 's/\.[a-zA-Z]*$//'`
ffmpeg -i "$i" -vcodec libx264 -b 2000k -aspect 16:9 -bf 3 -b_strategy 1 -coder 1 -qmin 10 -qmax 51 -sc_threshold 40 -flags +loop -cmp +chroma -me_range 16 -me_method hex -subq 5 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -directpred 1 -flags2 +fastpskip -dts_delta_threshold 1 -acodec libfaac -ab 44100 ""$start_name"".avi""
done

Для себя писал скрипт mkv2avi, ему можно скармливать целые папки или только файлы. Думаю ход мысли поймете и переделаете его под себя:
(Нажмите, чтобы показать/скрыть)
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн gektor-m

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Огромное СПАСИБО вам Аliftin!
Все заработало.

Оффлайн netum

  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
Доброго времени суток.
2 aliftin: подскажите плз, по вашему скрипту. Если я правильно понял, ваш скрипт запускается так ./ваш_скрипт Matroska имя_конвертируемого_файла или ./ваш_скрипт directory
По-первому типу запуска выполняется "video" в которой есть строка start_name=`file "$file_name" | awk -F: '{print $1}' | sed 's/\.[a-zA-Z]*$//'` Для чего она? Если я ставлю после неё echo "$start_name", то вижу "Matroska моё_видео". И если я правильно понял, то эта строка должна отсеивать "Matroska", чего к сожалению не происходит. Или я не правильно понял назначение этой строки?

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
aliftin, во, как раз думал про такое — очень надо для DVD-проигрывателя. Большое спасибо!

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Нужно в скрипт функций добавить, что бы он распознавал размер файлов и конертировал исходя из этого. Для небольших файлов (размер около 2.2 гб) это самое то, а вот для тех что имеют размер больше чем 4.4 гб не подходит, так как у них ориентация экрана больше чем 720 точек. Где то видел статью в которой подробно расписывались соотношение точек для dvd-плеера, только вот найти что то не могу.

UP Починил почти все, но не могу правильно получить ширину фильма: midentify.sh и mkvinfo нагло врет. Как это обойти я не знаю, вот скрипт, может кто решит.
#!/bin/bash
#Mon Oct 25 18:45:06 MSD 2010
#mencoder -ovc xvid -xvidencopts bitrate=2000 -oac mp3lame -aid 0 -o film.avi film.mkv

file_name=$@
IFS=$'\n'

folder(){
cd "$file_name"
mkdir ./complete/


for i in `ls | grep mkv`
do

start_name=`echo $i | sed 's/\.[a-zA-Z]*$//'`

width_old=`/usr/share/mplayer/midentify.sh "$i" | grep ID_VIDEO_WIDTH | awk -F "=" '{print $2}'`
height_old=`/usr/share/mplayer/midentify.sh "$i" | grep ID_VIDEO_HEIGHT | awk -F "=" '{print $2}'`

if [ "$width_old" -gt 720 ]
then
width_new=720
height_new=$(echo "scale=3; $width_new/($width_old/$height_old)" | bc | awk -F "." '{print $1}')
else
width_new=$width_old
height_new=$height_old
fi

mencoder -ovc xvid -xvidencopts bitrate=1000 -oac mp3lame -aid 0 -vf scale="$width_new":"$height_new" -o ""$start_name"".avi"" "$i"

mv ./""$start_name"".avi"" ./complete/""$start_name"".avi""
notify-send -i dialog-warning "`basename "$i" | sed 's/\.[a-zA-Z]*$//'`.avi complete"

done
}

video(){
start_name=`file "$file_name" | awk -F: '{print $1}' | sed 's/\.[a-zA-Z]*$//'`
i="$file_name"

width_old=`/usr/share/mplayer/midentify.sh "$i" | grep ID_VIDEO_WIDTH | awk -F "=" '{print $2}'`
height_old=`/usr/share/mplayer/midentify.sh "$i" | grep ID_VIDEO_HEIGHT | awk -F "=" '{print $2}'`

if [ "$width_old" -gt 720 ]
then
width_new=720
height_new=$(echo "scale=3; $width_new/($width_old/$height_old)" | bc | awk -F "." '{print $1}')
else
width_new=$width_old
height_new=$height_old
fi

mencoder -ovc xvid -xvidencopts bitrate=1000 -oac mp3lame -aid 0 -vf scale="$width_new":"$height_new" -o ""$start_name"".avi"" "$i"

notify-send -i dialog-warning "`basename "$file_name" | sed 's/\.[a-zA-Z]*$//'`.avi complete"
}

quit(){
echo "Missing the target"
}


if [ -n "`file "$@" | grep Matroska`" ]
then
video
elif [ -n "`file "$@" | grep directory`" ]
then
folder
else
quit
fi

Зато теперь он нормально воспринимает пробелы.
« Последнее редактирование: 11 Ноября 2010, 00:44:33 от aliftin »
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
netum, эта строка выдает имя файла без расширения:
aliftin@r2d2:~$ file film.mkv
film.mkv: Matroska data
aliftin@r2d2:~$ file film.mkv | awk -F: '{print $1}'
film.mkv
aliftin@r2d2:~$ file film.mkv | awk -F: '{print $1}' | sed 's/\.[a-zA-Z]*$//'
film
aliftin@r2d2:~$

Это нужно для того, что бы потом передать имя команде и дописать ".avi".
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн Svertal

  • Активист
  • *
  • Сообщений: 893
  • КиберПанк
    • Просмотр профиля
netum, эта строка выдает имя файла без расширения:
aliftin@r2d2:~$ file film.mkv
film.mkv: Matroska data
aliftin@r2d2:~$ file film.mkv | awk -F: '{print $1}'
film.mkv
aliftin@r2d2:~$ file film.mkv | awk -F: '{print $1}' | sed 's/\.[a-zA-Z]*$//'
film
aliftin@r2d2:~$

Это нужно для того, что бы потом передать имя команде и дописать ".avi".
Можно еще короче записать, что то вроде
${i%.*}Так тоже отсечет все символы с конца до первой точки.


Строки с получением разрешения видео тоже можно чуть сократить
width_old=`/usr/share/mplayer/midentify.sh "$i" | grep ID_VIDEO_WIDTH | awk -F "=" '{print $2}'`можно так
width_old=`/usr/share/mplayer/midentify.sh "$i" | sed -n '/ID_VIDEO_WIDTH=/ s///p'

А тут я не уверен, но может быть эту строку
height_new=$(echo "scale=3; $width_new/($width_old/$height_old)" | bc | awk -F "." '{print $1}')можно записать так
height_new=$(($width_new*$height_old/$width_old))


Вот, записал скрипт aliftin, но чуть короче
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 23 Ноября 2010, 13:18:15 от Svertal »

 

Страница сгенерирована за 0.174 секунд. Запросов: 22.