Вывод в канал и файл одновременно, даже если канал не принимает входные данные - PullRequest
0 голосов
/ 04 июля 2018

Итак, я сделал скрипт для Cygwin, который использует Windows ImageMagick и FFmpeg, но я не уверен, будут ли результаты здесь применимы и для bash в Linux. Итак, что скрипт делает, у меня есть несколько мультипликационных видеофайлов, и я использую Waifu2x для улучшения и масштабирования изображений до 4K, а затем использую ImageMagick для передачи его в FFmpeg, который также используется для изменения его размера до 3840x2160 в случае, если разрешение немного отличается. Вот небольшой скрипт, который я написал для этого примера, чтобы упростить его вывод в FFmpeg, поскольку реальный скрипт очень длинный и сложный.

#!/bin/bash
fun(){
convert out.png JPG:-|tee "$outfile"
}
fun|ffmpeg -f image2pipe -r 60 -i - -c:v libx265 -movflags +faststart "$outputfile"

Теперь, что я заметил, так это то, что если FFmpeg не удается кодировать, функция продолжает работу, но не может вывести на $outfile. Я хочу, чтобы он мог выводить в этот файл в случае сбоя кодирования, поскольку я также записываю все изображения в папку кэша для FFmpeg, чтобы выполнить его в случае сбоя кодирования, но я также хочу записать в оба труба для FFmpeg и файл одновременно. Кажется, что происходит то, что команда tee, похоже, отказывается записывать в файл, если она не может записать в канал. Я не уверен, предназначено ли это поведение, и / или если это также делает это на Linux bash. Как я могу обойти это и сделать так, чтобы он записывал в файл, даже если он не может записывать в канал, но записывать в оба одновременно, а не записывать в файл и пытаться прочитать его обратно в канал?

1 Ответ

0 голосов
/ 05 июля 2018

Вы пробовали tee с опцией -p? Он заставляет tee продолжать запись, даже если tee не может записать в стандартный вывод, что в вашем случае означает, что он должен справиться, если ffmpeg не удастся.

fun() {
        convert out.png JPG:- | tee -p "$outfile"
}
...