LINUX.ORG.RU

ffmpeg странно работает в скрипте: неправильно обрабатывает имена входа/выхода

 , , ,


0

1

Есть скрипт:

while read filename; do
    input="Музыка/$filename"
    corr_name=$(echo "$filename" | sed 's/[\?\*\:]/_/g')
    output="Музыка.output/${corr_name%.*}.ogg"
    mkdir -p "$(dirname "$output")"
    ffmpeg -i "$input" -c:a libvorbis -q:a 10 -vn "$output"
    echo ВХОД "$input" ВЫХОД "$output"
done < <(find Музыка -type f -printf '%P\n')
Суть: полностью скопировать иерархию Музыка в Музыка.output с перекодировкой в .ogg. Что странно: в процессе выполнения ffmpeg как-то криво получает имена файлов (и, похоже, их корёжит в самих переменных (понимаю, бред. Но иного объяснения у меня нет)), в результате чего Unheilig превращается то в nheilig, то в eilig, а «Reignite - Mass Effect Tribute Song» превращается в «s Song» (это к примеру). При этом, echo «$input» «$output» тоже показывают бред из скрипта. НО! Если я заменю ffmpeg на libav, или вообще уберу конвертацию из скрипта, т.е. оставлю только создание директорий и выхлоп или вообще только выхлоп, то всё работает прекрасно! Я не понимать. Пожалуйста, помогите.

★★

Да, сталкивался с таким же решал через костыли, запуск отдельного шела которому передавалось имя файла в котором уже запускался ffmpeg-a для каждого файла.

surefire ★★★ ()
Ответ на: комментарий от surefire

А почему такое происходило, не знаешь?

И правильно ли я понимаю суть твоего манёвра? Создаются два скрипта. Один генерирует имя входного файла и имя выходного, в другом живёт только ffmpeg, который принимает два аргумента на вход. Этот самый второй скрипт выполняется для каждой строки, выходящей из первого скрипта.

Valdor ★★ ()
Ответ на: комментарий от Valdor

А почему такое происходило, не знаешь?

Честно говоря не разбирался в причинах, мне нужен был результат побыстрее.

И правильно ли я понимаю суть твоего манёвра?

Да, совершенно верно.

surefire ★★★ ()

Чую, что у тебя установлен libav, а вместо ffmpeg - затычка, кричащая «ffmpeg deprecated!» и дергающая avconv.

Покажи «ffmpeg -version».

fopen ★★ ()

Эх, школота и ламерье кругом.

ffmpeg читает stdin и «ворует» его у while. Добавь < /dev/null и узбагойся.

...
ffmpeg -i "$input" -c:a libvorbis -q:a 10 -vn "$output" < /dev/null
...
anonymous ()
Ответ на: комментарий от fopen

У меня и libav и ffmpeg стоят полноценные, первое - из репозитория, второе - из Ppa.

Valdor ★★ ()
Ответ на: комментарий от anonymous

А я и не терял душевного спокойствия. Спасибо, всё работает.

Valdor ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.