Рейтинг:1

Как передать вывод FFMPEG 2 уровня конвейерной обработки в скрипт bash

флаг cn

Я пытался прокачать 2 уровня в глубину.

Я могу успешно передать:

  1. ffmpeg | grep
  2. ffmpeg | сед

я не могу трубить

  1. ffmpeg | грэп | сед
  2. ffmpeg | сед | grep

Я не понимаю, ffmpeg ограничивается только одним каналом в цепочке?

Этот код НЕ имеет ВЫХОДА с 2 каналами и без ошибок:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | grep молчание_длительность | sed "s/.*silence_duration: \(.*\).*/\1/"

Ожидаемый результат:

2.06442
0.719252
0.594036
0.562698
0.500295

Этот код имеет правильный вывод с 1 каналом:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | grep молчание_длительность

Вывод:

[silencedetect @ 0000018027f9bd00] молчание_конец: 2.06442 | тишина_длительность: 2.06442
[silencedetect @ 0000018027f9bd00] молчание_конец: 3.45971 | тишина_длительность: 0,719252
[silencedetect @ 0000018027f9bd00] молчание_конец: 7.04399 | тишина_длительность: 0,594036
[silencedetect @ 0000018027f9bd00] молчание_конец: 7.81501 | тишина_длительность: 0,562698
[silencedetect @ 0000018027f9bd00] молчание_конец: 9.05535 | тишина_длительность: 0,500295

Этот код имеет правильный вывод с 1 каналом:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | sed "s/.*silence_duration: \(.*\).*/\1/"

Вывод:

[silencedetect @ 000001a48277b980] молчание_старт: 0
2.06442
[silencedetect @ 000001a48277b980] молчание_старт: 2.74045
0,719252
[silencedetect @ 000001a48277b980] молчание_старт: 6.44995
0,594036
[silencedetect @ 000001a48277b980] молчание_старт: 7.25231
0,562698
[silencedetect @ 000001a48277b980] молчание_старт: 8.55506
0,500295
Рейтинг:3
флаг jp

Почему грэп | сед ничего не делая?

Это так, но вы этого не ждали. Если вы нажмете д тогда ffmpeg закроет поток тишина_длительность значения будут отображаться.

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

Как изолировать тишина_длительность ценности?

Если конечной целью является изоляция тишина_длительность ценности используют аук:

ffmpeg -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0.5 -f null - 2>&1 | awk -F ': ' '/silence_duration/ {print $3}'

Результат:

2.06442
0.719252
0.594036
0.562698
0.663968
1.24109

Однако я предпочитаю использовать (а) метаданные filter с помощью фильтров, поддерживающих ключи метаданных. Это сложнее, но вывод чище и его легче анализировать. Вы можете легко передать информацию (файл=-) или вывод непосредственно в файл (файл = тишина.log):

ffmpeg -ошибка уровня журнала -i "https://17563.live.streamtheworld.com/WETAFM.mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0,5,ametadata=mode=print:key=lavfi. тишина_длительность:файл=- -f ноль - | awk -F = '/silence_duration/ {print $2}'
Jim Dandy BOA avatar
флаг cn
Спасибо огромное! Это очень помогло мне, я взял ваш код и изменил его, чтобы добавить в файл молчания.log с небольшим изменением: ffmpeg -loglevel error -i "https://17563.live.streamtheworld.com/WETAFM. mp3?nocache=Ag6q8pw2" -af Silencedetect=n=-10dB:d=0.5,ametadata=mode=print:key=lavfi.silence_duration:file=- -t 30 -f null - | awk -F = '/silence_duration/ {print $2 >> "silence.log"}'
llogan avatar
флаг jp
@JimDandyBOA Рассмотрите возможность удаления `-t 30`, если вы хотите обрабатывать более 30 секунд. Я забыл удалить это из ответа изначально.
Jim Dandy BOA avatar
флаг cn
По совпадению, до того, как вы добавили -t 30, я добавил то же самое накануне вечером, чтобы принудительно записать в выходной файл, потому что awk буферизует вывод в файл, но не буферизует на экран терминала. Мои намерения состояли в том, чтобы вызвать FFmpeg в цикле while как хак. Этот метод работал, но открывал и закрывал банку с червями. Что ж, я многому научился и надеюсь, что этот пост будет полезен другим. Еще раз спасибо

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.