2016-10-04 4 views
0

В ffmpeg есть структура AVFrame, описывающая декодированные видео или аудиоданные.«непрозрачный» указатель в ffmpeg AVFrame

У этого есть указатель Пустоты opaque. В документации утверждается, что это «для некоторых частных данных пользователя».

Что это значит? Может ли он использоваться для транспортировки любых дополнительных данных в виде метаданных в кадре?

ответ

3

Это поле, предназначенное для пользователей (в отличие от библиотек ffmpeg); ffmpeg никак не коснется этого поля, поэтому вы можете использовать его по своему усмотрению. Однако есть оговорка: некоторые функции ffmpeg сделают копию AVFrame (или, возможно, переместите ссылку из AVFrame в другую), которая включает в себя копирование значения этого поля. Возможно, было бы сложно управлять временем жизни данных, на которые указывает это поле.

Если вам просто нужно справиться с некоторыми за кадром метаданных, вы можете рассмотреть существующие хранилища метаданных, доступных в AVFrame (см av_frame_get_metadata/av_frame_set_metadata)

+0

Можете ли вы прокомментировать предполагаемую установку для использования 'av_frame_get_metadata' /' av_frame_set_metadata'? Кажется, он не существует в 'libav' версии 6: 9.18-0ubuntu0.14.04.1 –

+0

@ R2-D2 Вы отметили это с помощью [tag: ffmpeg] и упомянули его в своем названии, но [вы на самом деле не используете FFmpeg ] (http://stackoverflow.com/questions/9477115/what-are-the-differences-and-similarities-between-ffmpeg-libav-and-avconv/9477756#9477756). Возможно, я ошибаюсь, но я не думаю, что у вилки Libav есть 'av_frame_set_metadata'; или, по крайней мере, древний источник, который вы используете, вероятно, нет. – LordNeckbeard

+0

Libav никогда не применял набор патчей метаданных; последние версии libav имеют побочные данные, которые могут быть (ab) использованы для выполнения аналогичных действий. Что еще более важно, libav v9 настолько стар, что у него нет метаданных или боковых данных, и ему даже не хватает буферов ref. Это предварительно refcounted frames API, что означает использование 'opaque' проще, поскольку вы можете связать время жизни метаданных с временем жизни AVFrame. Это также ваш единственный выбор с этой версией libav. –

3

Чтобы расширить немного о том, что сказал @Andrey Туркин, целью которых является добавьте данные объекта, специфичные для приложения, в структуру AVFrame. Конкретный вариант использования обычно заключается в том, что приложение распределяет память (используя обратный вызов get_buffer2). Эта память может быть просто указателем, но иногда это может быть память в графическом процессоре или что-то в этом роде. Несмотря на это, если приложение владеет данными и создает объект, связанный с выделенным буфером памяти/изображения, ему обычно требуется доступ к связанному объекту, когда декодер возвращает данный AVFrame в функции avcodec_decode_video2(), и это то, что вы обычно хотите использовать непрозрачное поле для.

+1

В настоящее время в AVBuffer обычно используются непрозрачные поля (и, возможно, другие поля) в этих случаях, а не в AVFrame. –

+0

Итак, если я правильно понимаю: при кодировании видеоданных любые пользовательские данные, на которые указывает 'opaque', не будут отображаться в результирующем файле/потоке? –

+1

Да. ffmpeg не будет читать или писать в это поле, ожидайте установки для установки его NULL при создании фрейма и копирования его значения при копировании фреймов. –

Смежные вопросы