2015-09-07 7 views
1

Я пытаюсь извлечь необработанные потоки с устройств и файлов с помощью ffmpeg. Я замечаю важную информацию о кадре (видео: ширина, высота, формат пикселей, цветовое пространство, формат аудио: образец) сохраняется как в AVCodecContext, так и в AVFrame. Это означает, что я могу получить доступ к нему до начала воспроизведения потока, и я могу получить к нему доступ для каждого кадра.API FFMPEG - насколько изменяются параметры потока в кадре?

Сколько я должен учитывать эти значения, изменяя рамки в кадре? Я нашел https://ffmpeg.org/doxygen/trunk/demuxing__decoding_8c_source.html#l00081, который указывает, что по крайней мере формат ширины, высоты и пикселя может изменить рамку на кадр.

  • Будет ли цветовое пространство и формат выборки также сменяться рамкой?
  • Будут ли эти изменения временными (один кадр) или длительными (значительным блоком кадров) и есть ли способ предсказать для этого потока, какое поведение произойдет?
  • Есть ли способ найти наиболее описательные атрибуты, которые этот поток можно создать, чтобы я мог масштабировать все низкокачественные кадры вверх, но не предлагать результат, который бездумно более качественный, чем источник, даже если это устройство или сетевой поток, где я не могу воспроизвести все кадры заранее?

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

+0

Не задавайте вопросы с тегами [tag: c] или [tag: C++], не ссылаясь на код, который у вас есть. Благодарю. –

+0

Спасибо за уведомление. – kacey

ответ

2

Таким образом, чтобы добавить к какому @szatmary says, типичный случай использования для изменения параметров потока адаптивные потоковый:

  • представьте, что вы смотрите YouTube на ноутбуке с различными методами подключения к Интернету, и вдруг пропускной способность уменьшается , Ваш поток автоматически переключится на более низкую полосу пропускания. FFmpeg (который используется Chrome) должен поддерживать это.
  • альтернативно, представьте себе аналогичный сценарий в видеочате rtc.

Причина, по которой FFmpeg делает то, что она делает, заключается в том, что API по существу пытается учесть общий знаменатель. Видео, снятое по телефону, никогда не изменит разрешение. Также большинство видео не экспортируется из программного обеспечения для редактирования видео. Даже видео с youtube-dl обычно не переключают разрешение, это решение на стороне клиента, и youtube-dl просто не сделает этого. Итак, что нужно делать? Я бы просто использовал информацию о потоке из первого кадра (ов) и перетащил все последующие кадры на это разрешение. Это будет работать на 99,99% для случаев. Независимо от того, хотите ли вы разместить свой сервис на оставшиеся 0,01%, зависит от того, какие типы видеороликов вы думаете о том, что люди будут загружать и какие изменения в разрешении имеют смысл в этом контексте.

Изменяется ли изменение цвета? Они могли (теоретически) использовать программное обеспечение, которое смешивает запись экрана с видеофрагментами, но это маловероятно (на практике). Формат выборки изменяется так же часто, как разрешение видео: нередко в адаптивном сценарии, но независимо от того, насколько вы заботитесь, зависит ваш сервис и типы видео, которые вы ожидаете получить.

+0

Спасибо за лучший ответ. Неоднозначность ffmpeg api кажется немного неудачной; На данный момент я смотрю на gstreamer. – kacey

0

Обычно не часто или никогда. Тем не менее, это основано на кодеке и являются опциями, выбранными во время кодирования. Я передаю декодированные кадры через swscale на всякий случай.