LINUX.ORG.RU

ffmpeg «ломается» в цикле

 ,


0

2

Странная какая-то штука при использовании ffmpeg в цикле. Хочу вшить внешние аудио дорожки в видео. Названия одинаковые, отличается только одна буква в расширении. Содержание директории такое:

./NAME-S01E10.mkv
./NAME-S01E12.mka
./NAME-S01E20.mkv
./NAME-S01E13.mkv
./NAME-S01E01.mkv
./NAME-S01E17.mkv
./NAME-S01E05.mka
./NAME-S01E13.mka
./NAME-S01E10.mka
./NAME-S01E24.mkv
./NAME-S01E08.mka

Каждому видеофайлу mkv соответсвует аудиофайл mka. Если вшивать вручную по одному

ffmpeg -i NAME-...mkv -i NAME-...mka -map 0 -map 1 -c copy NAME-...-RUS.mkv

Все работает без проблем. Но если зациклить процесс

find -mindepth 1 -maxdepth 1 -type f -name 'NAME-*mkv' | while read vid; do vid=${vid#\.\/}; aud=${vid/mkv/mka}; ffmpeg -i $vid -i $aud -map 0 -map 1 -c copy ${vid/\.mkv/-RUS.mkv}; done

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

Unrecognized option 'NAME-...-RUS.mkv'.
Parse error, at least 3 arguments were expected, only 1 given in string '-S01E20.mkv'

Если выводить через echo то получаю нормальные рабочие команды

ffmpeg -i NAME-S01E10.mkv -i NAME-S01E10.mka -map 0 -map 1 -c copy NAME-S01E10-RUS.mkv
ffmpeg -i NAME-S01E20.mkv -i NAME-S01E20.mka -map 0 -map 1 -c copy NAME-S01E20-RUS.mkv
ffmpeg -i NAME-S01E13.mkv -i NAME-S01E13.mka -map 0 -map 1 -c copy NAME-S01E13-RUS.mkv
ffmpeg -i NAME-S01E01.mkv -i NAME-S01E01.mka -map 0 -map 1 -c copy NAME-S01E01-RUS.mkv
ffmpeg -i NAME-S01E17.mkv -i NAME-S01E17.mka -map 0 -map 1 -c copy NAME-S01E17-RUS.mkv
ffmpeg -i NAME-S01E24.mkv -i NAME-S01E24.mka -map 0 -map 1 -c copy NAME-S01E24-RUS.mkv
ffmpeg -i NAME-S01E18.mkv -i NAME-S01E18.mka -map 0 -map 1 -c copy NAME-S01E18-RUS.mkv
ffmpeg -i NAME-S01E14.mkv -i NAME-S01E14.mka -map 0 -map 1 -c copy NAME-S01E14-RUS.mkv

Все файлы нормальные, не битые. Через ls *mkv | while read ... такая же байда. В чем подвох?


Ответ на: комментарий от Spoofing

Да делал уже, там тоже самое, что через echo ffmpeg выводит

#!/bin/bash

ls *mkv | while read vid; do
    aud=${vid/mkv/mka}
    out=${vid/\.mkv/-RUS.mkv}
    ffmpeg -i $vid -i $aud -map 0 -map 1 -c copy $out
done
+ read vid
+ ls NAME-S01E01.mkv NAME-S01E02.mkv NAME-S01E03.mkv NAME-S01E04.mkv NAME-S01E05.mkv NAME-S01E06.mkv NAME-S01E07.mkv NAME-S01E08.mkv NAME-S01E09.mkv NAME-S01E10.mkv NAME-S01E11.mkv NAME-S01E12.mkv NAME-S01E13.mkv NAME-S01E14.mkv NAME-S01E15.mkv NAME-S01E16.mkv NAME-S01E17.mkv NAME-S01E18.mkv NAME-S01E19.mkv NAME-S01E20.mkv NAME-S01E21.mkv NAME-S01E22.mkv NAME-S01E23.mkv NAME-S01E24.mkv NAME-S01E25.mkv NAME-S01E26.mkv
+ aud=NAME-S01E01.mka
+ out=NAME-S01E01-RUS.mkv
+ ffmpeg -i NAME-S01E01.mkv -i NAME-S01E01.mka -map 0 -map 1 -c copy NAME-S01E01-RUS.mkv

И дальше опять

Parse error, at least 3 arguments were expected, only 1 given in string '-S01E02.mkv'
knd
() автор топика
Последнее исправление: knd (всего исправлений: 2)
Ответ на: комментарий от gremlin_the_red

Кавычки в моем случае не нужны, там нет спец.символов.

knd
() автор топика
Ответ на: комментарий от knd

Можно попробовать передать -nostdin в ffmpeg. По ошибкам я подумал, что дело не в нём, но раз цикл с read, то должно быть нужно всё-таки.

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

Так работает, спасибо. Значит надо в циклах отключать ввод ffmpeg. Буду знать.

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