1

Почему ffmpeg выполняет каждую вторую задачу, для которой он заказан?

for i in *.MTS; do
     echo ffmpeg -i \"$i\" -c:a copy -c:v copy \"$i\" | sed 's/MTS/mp4/2'
done | sh

Например. если у меня есть 9 MTS файлов, таких как:

0001.MTS
0002.MTS
0003.MTS
0004.MTS
0005.MTS
0006.MTS
0007.MTS
0008.MTS
0009.MTS

Это преобразует только 001 003 005 007 009 . Есть причина для этого? Та же команда без | sh печатает правильный набор заказов. Это становится действительно головной болью, когда у вас есть 64 видео файлов.

1 ответ1

2

Я не знаю, почему только каждая вторая команда ffmpeg выполняется, я не мог воспроизвести это на моей машине. Однако вы подходите слишком сложно. Более чистое решение будет:

  • для bash совместимых оболочек:

    for i in *.MTS; do
      ffmpeg -i $i -c:a copy -c:v copy ${i%MTS}mp4
    done
    

    Пожалуйста, прочитайте о % и связанных операторах в разделе Расширение параметров на справочной странице bash .

  • для csh совместимых оболочек:

    foreach i (*.MTS)
      ffmpeg -i $i -c:a copy -c:v copy $i:r.mp4
    end
    

    Здесь модификаторы :r удаляют расширение файла. Подробнее о некоторых других модификаторах читайте в (несколько не интуитивно) разделе « Подстановка истории» справочной страницы по tcsh .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .