泉州关键词网站排名,凡科网站登录入,自流井移动网站建设,wordpress customizr目录
引文
行字节数的计算
ffmpeg中的align
ffmpeg中的linesize
内容参考 引文
在ffmpeg的使用过程中有时会发现align这个参数#xff0c;那么这个参数代表什么意思#xff0c;不同的值会产生什么影响呢#xff0c;详见下文。 行字节数的计算
理解内存对齐之前首先要…目录
引文
行字节数的计算
ffmpeg中的align
ffmpeg中的linesize
内容参考 引文
在ffmpeg的使用过程中有时会发现align这个参数那么这个参数代表什么意思不同的值会产生什么影响呢详见下文。 行字节数的计算
理解内存对齐之前首先要理解行的概念视频有宽高两个概念行通常是与宽相关联的。例如一张1280*720的图片其宽就为1280但其行却并不一定为1280行具体为多少要取决于对齐数align是多少一个行的大小必须是对齐数align的整数倍类似于C语言的结构体对齐。假设一张1280*720的图片如果align为1则行就为1280如果align为3则行为1281需要在1280的基础上补1个字节。行的字节数计算方法可以概括为 其中ceil表示向上取整。
其实上面的说法不是很严谨因为一个像素点不可能只有一个字节以rgb存储模式为例一个像素点有rgb三个通道每个通道占1字节的话那么一个像素点就会占3个字节那么在align为1的情况下1280*720的图片在实际存储时每一行的字节数就不是1280了而是1280*33840所以总大小就为3840*720。
也就是说对齐是根据实际存储字节大小来计算的我们先要计算出这一行实际占用的字节数再根据计算出的字节数来计算对齐。例如3*10的图片每个像素点占2个字节对齐数align为4那么行数是多少呢从条件可知每行3个像素点每个像素点占2字节那么每行就是6字节而对齐数是46不是4的整数倍因此6需要补2个字节凑成8,8就是4的整数倍了那么我们就知道每行在内存中实际占用了8个字节后两个字节是为了对齐补上的总共有10行那么这张图片在实际内存中就占用了8*1080个字节而不是60个字节了。本来这张图片只需要60个字节为何要用80个字节来存储呢这是因为cpu并不能从任意地址开始读取数据如果不对齐那么可能需要多次读取才能读到完整数据因此对齐主要是为了提升性能典型的空间换取时间。
值得注意的是yuv的计算以w*h的yuv420p为例他是分三个平面存储三个分量的而u和v的计算是一致的也就是说计算出了u即可得到v对于y来说它有w行h列因此需要计算w行的对齐后字节数再乘以h对于u来说它有w/2行h/2列这是因为每4个y共享一组uv因此需要计算w/2行的对齐后字节数再乘以h/2v的计算与u的一模一样最后将这个三个数相加即可。 ffmpeg中的align
有了上面的基础后现在就好理解ffmpeg中align参数了。所以一般ffmpeg中的align设为1就表示不对齐的意思设的为多少就是多少。为0一般就表示默认ffmpeg提供的方法。
而之所以ffmpeg要设置这个align对齐数主要就是为了为了确保解码和播放的正确性和输出的数据符合特定容器的要求。而且对齐还可能影响到性能特别是在硬件加速的场景下未对齐的数据访问可能导致额外的延迟或降低效率。 ffmpeg中的linesize
linesize其实就是我们上文提及到的行字节数在我们解码出数据后经常会遇到这个linesize既然我们知道了align的概念就该明白这个linesize就是为了让你取出真实的数据的。
解码后的数据中可能是经过对齐的既然有对齐那就是数据里加多了一些为了对齐而多余的字节如果我们想最后显示视频数据那么这些多余的数据势必要进行剔除掉那么怎么剔除呢linesize就是来帮你干这事的有了它你就可以一行一行比较然后把每行最后为了对齐而补的字节删除还原出视频的真实数据
内容参考
本文内容是基于如下博客做的归纳整理如有侵权请联系作者 FFmpeg简单分析系列----内存对齐简要说明_ffmpeg align-CSDN博客