Я хотел бы сделать копию AVPacket, чтобы я мог декодировать ее позже, когда захочу.
AVPacket от аудиопотока.
av_dup_packet, похоже, не работает.
Конструктор копирования AVPacket не работает.
Создание моего собственного конструктора копирования вызывает повреждение памяти.
Способ скопировать структуру AVPacket: (это работает)
AVPacket newPacket(oldPacket);
newPacket->data = reinterpret_cast<uint8_t*>(new uint64_t[(oldPacket->size + FF_INPUT_BUFFER_PADDING_SIZE)/sizeof(uint64_t) + 1]);
memcpy(newPacket->data, oldPacket->data, oldPacket->size);
Причина в том, что некоторые декодеры используют оптимизации, которые требуют определенного выравнивания байтов и заполнения. Простое выделение oldPacket-> size не выделяет достаточно и не выделяет при правильном выравнивании байтов.
Обратите внимание, что это может работать не во всех случаях, например, если для priv установлено что-то интересное.
AVPacket *newpacket = (AVPacket*)malloc(sizeof(struct AVPacket));
av_init_packet(newpacket);
av_packet_ref(newpacket, packet);
av_packet_unref(packet);
free(packet);
packet = nil;
Поскольку функция av_dup_packet устарела с октября 2015 года
094952
лучше использовать вместо этого av_packet_ref / av_packet_unref.
Новый пакет должен быть выделен из памяти и после инициирован с помощью av_init_packet