【问题标题】:FFmpeg sws_scale on changed area更改区域上的 FFmpeg sws_scale
【发布时间】:2016-10-02 03:36:58
【问题描述】:

我使用sws_scale 将一组 RGB32 图像转换为 YUV420 格式。每张图像都与前一张非常相似,它们仅在矩形区域 Q 上有所不同。

我的问题是如何利用 Q 来加快转换过程?应在sws_scale 函数中添加一个附加参数。

sws_scale( ctx, in_plane, in_stride, sliceY, height, out_plane, out_stride, Q){
    // parameter out_plane stores the YUV420 data of previous image
    Instead of scanning the whole image, scan through rectangle Q{
        Do conversion
    }
}

【问题讨论】:

    标签: ffmpeg swscale


    【解决方案1】:

    当前 API 中不存在此类参数,但您可以按原样使用 sws_scale。您可以创建两种上下文 - 一种用于全图,一种用于 Q;为了只转换Q:

    • 使用您为 Q 创建的上下文
    • 移动所有数据指针,使它们都指向输入/输出图片中 Q 的第一个像素
    • 保持原样,以获取全貌

    这里需要注意几个注意事项:首先,由于您使用 YUV420 作为输出格式,因此您希望增加 Q,使其从偶数行/列开始并占据偶数宽度/高度(否则 Q 边框可能会出现一些扭曲的颜色)。其次,确保所有图片平面的指针都指向同一个像素——这需要根据像素格式为每个平面提供不同的偏移量。第三,如果没有缩放,这效果最好 - 否则,由于抖动,生成的图片可能看起来与全图片比例不完全相同。

    【讨论】:

    • 从资源的角度来看,创建一个新的上下文不是代价高昂吗?例如,如果区域在每一帧中随机变化?
    • 这取决于你对代价高昂的定义。它有一些小的内存分配和一些计算;与使用单个静态上下文进行全帧转换相比,初始化新上下文进行单个小区域转换(可能)更便宜。
    • 我想我每次都会在 libyuv 和 swscale 上做一些带有新上下文的基准测试,看看效果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2021-11-25
    • 2020-06-12
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多