ffmpeg - папка опроса файлов и потоковая передача видео с помощью rtp

Возможно, вам захочется узнать, почему это происходит. Вместе с великое объяснение этого другого парня найдет ссылку на . Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? , написанный Жилем в Unix & amp; Linux :

Зачем мне писать "$foo"? Что происходит без кавычек?

$foo не означает «принять значение переменной foo». Это означает нечто гораздо более сложное:

  • Сначала возьмите значение переменной.
  • Разбиение поля: обрабатывайте это значение как список полей, разделенных пробелами, и создавайте результирующий список. Например, если переменная содержит foo * bar ​, то результатом этого шага будет 3-элементный список foo, *, bar.
  • Генерация имени файла: обрабатывайте каждое поле как глобус, т. е. как шаблон подстановочного знака, и заменяйте его на список имен файлов, соответствующих этому шаблону. Если шаблон не соответствует никаким файлам, он остается неизмененным. В нашем примере это приводит к списку, содержащему foo, следуя списку файлов в текущем каталоге и, наконец, bar. Если текущий каталог пуст, результат будет foo, *, bar.

Обратите внимание, что результатом является список строк. В контексте синтаксиса оболочки есть два контекста: контекст списка и контекст строки. Разделение поля и генерация имени файла происходят только в контексте списка, но это в большинстве случаев. Двойные кавычки ограничивают контекст строки: вся строка с двумя кавычками - это одна строка, которую нельзя разделить. (Исключение: "$@", чтобы перейти к списку позиционных параметров, например "$@" эквивалентно "$1" "$2" "$3", если есть три позиционных параметра. См. В чем разница между $ * и $ @? )

То же самое происходит с подстановкой команды с помощью $(foo) или с помощью `foo`. На стороне примечания не используйте `foo`: его правила цитирования являются странными и не переносимыми, и все современные оболочки поддерживают $(foo), что абсолютно эквивалентно, за исключением наличия интуитивных правил цитирования.

вывод арифметической подстановки также проходит те же разложения, но это обычно не вызывает беспокойства, поскольку он содержит только нерасширяемые символы (если IFS не содержит цифр или -).

См. Когда требуется двойное цитирование? для получения более подробной информации о случаях, когда вы можете оставить кавычки.

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

0
задан Omer 16 January 2019 в 09:50
поделиться

1 ответ

Как я уже говорил в комментарии, поскольку вы повторно запускаете ffmpeg каждый раз, значения pts сбрасываются, но клиент воспринимает это как один непрерывный поток ffmpeg и, таким образом, ожидает увеличения значений PTS.

Как я уже сказал, вы можете использовать оболочку Python ffmpeg для управления потоковой передачей самостоятельно, но да, это довольно много кода. Но на самом деле есть грязный обходной путь.

Итак, очевидно, есть параметр -itsoffset, с помощью которого вы можете сместить входные метки времени (см. Документацию FFmpeg ). Так как вы знаете и управляете скоростью, вы можете передать возрастающее значение с помощью этого параметра, чтобы каждый следующий поток был смещен на соответствующую длительность. Например. если вы передаете 30 кадров каждый раз, и вы знаете, что частота кадров равна 30, 30 кадров создают интервал времени в одну секунду. Таким образом, при каждом вызове ffmepg вы увеличиваете значение -itsoffset на одну секунду, что должно быть добавлено к выходным значениям PTS. Но я не могу гарантировать, что это работает.

Так как идея о -itsoffset не сработала, вы также можете попробовать передать jpeg-изображения через stdin в ffmpeg - см. эту ссылку.

0
ответ дан Rudolfs Bundulis 16 January 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: