有没有任何优化的函数,也许是在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;
}
我想了两种方法来做这件事。通常,如果我想在命令行中合并一个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转换的代码