Я ищу быстрый способ добавления собственного альфа-канала в декодированный кадр ffmpeg.Запись альфа-канала в декодированный кадр ffmpeg
У меня есть AVI-файл с информацией RGB, и у меня есть синхронизированный видеопоток, описывающий альфа-канал прозрачности (оттенки серого). При декодировании файла AVI с помощью ffmpeg я хочу преобразовать выходной кадр в RGBA, добавив свою собственную альфа-информацию. В конце концов, я получу полупрозрачный видеопоток.
Есть ли оптимизированная функция, возможно, в libswscale или libswresample, чтобы сделать такую вещь лучше, чем просто перебирать пиксели?
В основном я хотел бы иметь возможность написать такую функцию, если бы у меня была такая функция, как sws_scale_and_add_alpha:
void* FFmpegLib_nextFrame_withAlpha(void* _handle, uint8_t* my_alpha_channel)
{
FFmpegLibHandle* handle = (FFmpegLibHandle*)_handle;
AVPacket packet;
int frameFinished;
while(av_read_frame(handle->pFormatCtx, &packet) >= 0) {
// Is this a packet from the video stream?
if(packet.stream_index==handle->videoStream) {
// Decode video frame
avcodec_decode_video2(handle->pCodecCtx, handle->pFrame, &frameFinished, &packet);
// Did we get a video frame?
if(frameFinished) {
sws_scale_and_add_alpha
(
handle->sws_ctx,
(uint8_t const * const *)handle->pFrame->data,
handle->pFrame->linesize,
0,
handle->pCodecCtx->height,
handle->pFrameARGB->data,
handle->pFrameARGB->linesize,
my_alpha_channel
);
return handle->pFrameARGB->data;
}
}
}
return NULL;
}
Thanks @halfelf. Я видел пример альфа-карты и даже прокрался в реализацию c. Это немного похоже на ваш второй вариант программирования, поскольку он проходит через пиксели изображения argb. Я надеялся, по соображениям производительности, сделать это одним выстрелом, например, использовать замену sws_scale, которая будет конвертировать и добавлять альфа-канал одновременно. На самом деле, в конце концов, я использую rgb и альфа-каналы в качестве текстуры для шейдера OpenGL, поэтому он выглядит как лучший и самый параллельный вариант - объединить цвет и прозрачность внутри шейдера. –
@ Mic Приятно это слышать. На самом деле я уже делал подобные вещи в CUDA. Я считаю, что его производительность не хуже OpenGL. – halfelf