首页 > 编程语言 >x264改变输出分辨率的算法

x264改变输出分辨率的算法

时间:2022-12-23 17:12:08浏览次数:59  
标签:码流 480p src 分辨率 缩放 算法 x264

在某些应用场景下,x264的输入视频分辨率与接收端输出的视频分辨率不同。
例如编码端摄像头采集到的YUV数据为1280x720,而接收端视频显示窗口为640x480。
对于这种场景,一般的处理方式是:
源端:采集,编码,传输 720p的码流
收端:接收,解码720p的码流,缩放到480p去显示。
这种方式的劣势在于编码,传输了接收端用不到的大分辨率码流。

一种改进的方式是在源端缩放720p的视频输入数据:
源端:采集720p,缩放到480p,输入480p给x264编码器编码,传输 480p的码流
收端:接收,解码,显示480p的码流。
这种方式处理掉了传输大分辨率码流的问题,但不是最有效率的方式。因为缩放本身也有计算量,同时增加了一次一帧数据读写的操作。

研究x264的代码发现,x264通过以下函数实现输入源图像到准备编码帧的格式转换:
    int x264_frame_copy_picture( x264_t *h, x264_frame_t *dst, x264_picture_t *src );
其中有从src->img.planet调捡数据拷贝到dst->plane的过程,目的是实现src和dst之间颜色空间转换(x264内部用的原始数据帧,参考帧都是NV12/NV16格式, src如果是YV12需要转成NV12)。x264在这里假设src和dst的分辨率是相同的,只做颜色空间转换。既然这里有一次因为色彩空间转换而引起的数据搬移,那么可以把图像缩放操作加入其中一并完成,这样就可以达到改变输出分辨率的需求。

ffmpeg的sws_scale函数可以一次性的实现输入图像和输出图像之间分辨率以及颜色空间的转换。在这里如果发现输入输出分辨率不同,就用sws_scale函数替换掉原来plane_copy,plane_copy_interleave函数。在计算量几乎不变的情况下(缩放计算稍微增加一些计算量,但一帧数据读写操作没有增加),完美实现改变输出分辨率的功能。

标签:码流,480p,src,分辨率,缩放,算法,x264
From: https://www.cnblogs.com/kn-zheng/p/17001119.html

相关文章

  • BFS,DFS算法
    算法题目  基础:1.数组2.字符串3.排序4.贪心5.递归6.循环7.滑窗8.栈9.进制转换10.位运算11.队列12.哈希表13.链表14.线性表15.二分查找......
  • 青蛙过河算法
    Asmallfrogwantstogettotheothersideofariver.Thefrogisinitiallylocatedononebankoftheriver(position0)andwantstogettotheoppositeba......
  • C#-A*算法原理及代码实现
    前面提到过迪杰斯特拉算法,它的原理简述如下:1.将所有的点放在B集合。(起点距离为0,其他点为无穷大)2.从B集合找出距离最小的点,取走并放在A集合。3.根据A集合的新加入的点,......
  • 决策树算法
     ......
  • k近邻算法api初步使用
     ......
  • 排序算法模板(更新中)
    快速排序#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn;intq[N];voidposition(intq[],intl,intr){if(l>=r)ret......
  • 美颜SDK一键美颜的算法实现流程
    大家在使用美颜sdk时肯定用到过“一键美颜”这个功能,而一键美颜中又分为许多风格,从另一个角度来看,这更像是美颜sdk滤镜。总体来讲,一个效果比较好的“一键美颜”会涉及各种各......
  • 【实例分割算法】Mask Rcnn
    一、MaskRcnn1.理论:在FasterRcnn基础上添加一个Mask预测分支,每个类一张特征图2.网络框架......
  • 详解聚类算法Kmeans-概述 & 工作原理【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili有监督学习:模型在训练的时候,即需要特征矩阵X,也需要真实标签y。无......
  • 每日算法之二叉搜索树的第k个节点
    JZ54二叉搜索树的第k个节点题目给定一棵结点数为n二叉搜索树,请找出其中的第k小的TreeNode结点值。返回第k小的节点值即可不能查找的情况,如二叉树为空,则返回-1,或者k......