Форум программистов, компьютерный форум, киберфорум
Программирование мультимедиа
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 4 / 1
Регистрация: 24.01.2023
Сообщений: 20

ffmpeg, как самому создать буфер в AVPacket

28.12.2024, 20:35. Показов 4567. Ответов 1

Студворк — интернет-сервис помощи студентам
Кратко:
Стандартно кодер берёт на входе AVFrame и запихивает результат кодирования в AVPacket
Мне известен размер данных пакета и я хочу, чтобы результат кодирования сразу попадал в нужное мне место. Пробовал через av_packet_from_data, но не срабатывает, то есть он почему-то не берёт подсунутый ему буфер и я не понимаю почему.

Развернуто:
У меня написан видеоплейер, который выдаёт видео на видеокарту Blackmagic Decklink. В 10ти битном режиме ей требуется подсовывать кадр в формате v210 (хитрым образом упакованный YUV 4:2:2). В ffmpeg как формат пикселя v210 не поддерживается, но зато есть кодек v210.
Соответственно, я скармливаю декодированный кадр из файла в кодер v210, он выдаёт на выход AVPacket, в котором в данных содержится видеоданные. Далее я создаю кадр decklink, получаю ссылку на его данные и банальным Move копирую память из пакета в видеокадр. В рамках оптимизации хочется избавиться от этого Move и в пакет сразу подставить ссылку на данные кадра, чтобы кодер напрямую писал результат сразу в кадр. Так как в режиме 4K50p каждый кадр занимает примерно 22МБ и лишний 1ГБ/сек пересылок туда/сюда хотелось бы сократить.
Я пытался использовать av_packet_from_data. Не получается - просто создаётся новый буфер. И такое ощущение, что это как-то связано с выравниванием. Но это только предположение.
Как еще это можно сделать - я не понимаю и уже голову сломал.

Добавлено через 4 часа 28 минут
Что-то ни хрена не понимаю

Вроде av_packet_from_data сейчас работает, то есть когда я смотрю в отладчике, то все поля пакета заполняются правильно - data указывает на кадровый буфер, size правильный, визуально всё ок
Но когда я вызываю avcodec_receive_packet, то в пакете я получаю совершенно новый буфер.
Что ему не нравится - вообще не понимаю...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2024, 20:35
Ответы с готовыми решениями:

[FFmpeg] Как записать в файл только что прочитанный AVPacket?
Добрый день! Как сделать, чтобы пакеты записывались в новый контейнер без перекодирования видео? У меня есть проект транскодера,...

Как самому создать коллекцию?
На командном обсуждении разбирали структуры данных. Но вот вопрос, как было бы написать собственную коллекцию распологая лишь массивами в...

Как создать самому конструктор сайтов?
Всем привет. Имея только знания HTML и CSS, как создать конструктор сайтов самому? Может есть готовые движки? Мануалы? Статьи?...

1
4 / 4 / 1
Регистрация: 24.01.2023
Сообщений: 20
29.12.2024, 17:29  [ТС]
Порылся по исходникам. Вроде начал понимать. Пакет, созданный через av_packet_from_data имеет размер данных равный указанному. Кодер v210 при начале обработки кадры вычисляет требуемый размер пакета (равный размеру кадра) и вызывает ff_alloc_packet2. И вот тут, похоже, кроется засада. Проблема в том, при создании пакета к его запрошенному размеру автоматически добавляется AV_INPUT_BUFFER_PADDING_SIZE, то есть 32 байта. Судя по всему это сделано для того, чтобы указатель data можно было подвинуть вверх для выравнивания на 32 байта. И пофиг, что данные пакета уже выровнены на 32 байта - всё равно прибавляет. И, соответственно, имеющийся буфер в пакете уже меньше требуемого и автоматически создаётся новый пакет. Как с этим бороться - не понимаю пока
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2024, 17:29
Помогаю со студенческими работами здесь

Как создать flv с помощью ffmpeg?
Я установил ffmpeg по этому описанию: В папке usr\bin создаем папку ffmpeg Кидаем туда ffmpeg.exe, SDL.dll, pthreadGC2.dll В папку...

Как создать видеоконвертер на сайт без ffmpeg?
Всем привет! кто нибудь знает как на С# создать видеоконвертер на сайт без ffmpeg? Если это вообще возможно? может Кто-нибудь литературу...

Как самому создать 3D engine типа DOOM 1995
С наступившим 2021 годом вас форумчане!!!! Я хотел написать 3D движок как типа DOOM 1995 года не совсем такой без врагов но со...

Как самому создать сайт по недвижимости — за неделю, без знаний?
Добрый вечер! Хочу за неделю создать свой сайт по купле-продаже недвижимости. Никаких знаний у меня нет, поэтому подскажите,...

Как создать динамический двумерный массив и самому его заполнить?
Как создать динамический двумерный массив и самому его заполнить?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 09.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru