当前位置: 首页 > 知识库问答 >
问题:

将alpha信道写入解码ffmpeg帧

家浩瀚
2023-03-14

有没有任何优化的函数,也许是在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;
}

共有1个答案

苏高旻
2023-03-14

我想了两种方法来做这件事。通常,如果我想在命令行中合并一个alpha通道,ffmpeg为此提供一个alphamerge筛选器。而且我非常肯定你可以在C中做同样的事情,尽管编程可能很困难,(甚至在ffmpeg源代码中有一个视频滤波器的例子。)。

第二种是针对AVFrame结构我们自己进行编码。AVFrame的数据字段保存像素信息。我们需要把我们的阿尔法通道装进去。

首先将压缩后的图像帧像往常一样转换成打包的ARGB

// pFrameARGB should have been allocated and of pix_fmt `AV_PIX_FMT_ARGB`
sws_scale(sws_ctx, pFrame->data, pFrame->linesize, 0, height, pFrameARGB->data, pFrameARGB->linesize);
// cpp example, easy to convert to pure C
auto p = pFrameARGB->data[0];
for (auto i = 0; i < width * height; i++) {
    auto num = i * sizeof(uint8_t) * 4;
    auto div_result = std::div(num, width * sizeof(uint8_t) * 4);

    auto offset = pFrameARGB->linesize * div_result.quot + div_result.rem;
    p[offset] = my_alpha_channel[i];
}
 类似资料:
  • 我试图将alpha通道从灰度级的ProRes(mov)中提取到一个单独的mp4文件中(以便稍后在html页面上模拟带有Transperance的视频)。 但我没有得到一个填充的阿尔法通道,而只是它的一种边界。非常确定原始文件是ok的(尝试使用不同的文件),并将其编码为webm显示了正确的变通性。

  • null (它也应该与ffprobe和ffplay一起工作)

  • 我想在背景图像上覆盖透明视频。我有一个视频,其中上半部分是RGB对象,下半部分是阿尔法掩码。 现在,为了制作这个,我执行以下步骤:

  • 其他工具或简单的API也是受欢迎的。 我有一个序列的png与alpha,我想覆盖在一些视频的顶部。使用ffmpeg会很棒,但是使用imagemagick也是可以接受的。我可以提取视频中的所有帧,并使用imagemagick批量混合每一帧,然后重新编码(重新编码是可以接受的)。

  • 我正在尝试解码ADTS容器中的AAC音频流,该音频流来自外部硬件H264编码器。 我分析了ADT,它告诉我我有一个2通道,44100 AAC主配置文件框架。我为ffmpeg解码器设置了额外的数据字节,并成功解码了帧?详情如下: (伪c代码) 设置解码器: 设置额外的数据字节: 然后解码帧: 解码帧: 现在,据我所知,32位原始格式的每个帧每个采样将有4个字节,每个通道将被交错(因此每4个字节是交替

  • 我正在努力将Java代码转换为javascript。为此,例如,我正在将public静态int primesolution转换为函数primesolution。我不太知道我是否在转换它的正确轨道上。我被困在公共静态空main(String[]args)中。如何将此函数转换为Javascript。非常感谢任何帮助。 我用JavaScript转换的代码