ffmpeg 进行视频转换图像翻转的问题的修正-阿里云开发者社区

开发者社区> 杨粼波> 正文

ffmpeg 进行视频转换图像翻转的问题的修正

简介:
+关注继续查看

我在用FFMPEG 开发在DirectShow 环境下生成FLV的筛选器(Filter)的时候,碰到了一个比较古怪的问题。因为该筛选器的输入格式需要支持常见的RGB,和YUV格式。但是在输入是RGB格式的时候,最终生成的视频图像是翻转的。而用YUV格式确实没有问题的。

分析了一下程序,因为ffmpeg支持的最终存入FLV的格式是YUV420P,需要调用sws_scale进行图像的格式转换,应该是调用sws_scale进行图像格式转换的时候发生的图像反转。虽然问题很显然,但是却一直找不到好的办法,这个问题困扰了好久,也查看了ffmpeg的源代码。本想也一段代码,先把RGB格式的图像先手工做一次反转,再通过sws_scale进行处理,那样负负得正正好解决问题,当然实现这样的反转代码也比较简单,稍微花点时间就可以搞定。但是进行编解码处理的程序关键是性能,这样处理,因为图像反转操作,白白损失了大量的CPU。后来发现其实,有一个非常巧妙的方法可以解决这个问题。或许ffmpeg在开发的时候,他们早已考虑到了这个问题,已经预留了这个后门了。

办法是这样的:

先看看sws_scale的函数定义

int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[],
              int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])

其中src和srcStride定义了输入图像的四个平面的数据起始指针和四个平面中每一行包含的像素的个数。

dst和dstStride是输出变量,定义的是输出图像的四个平面的数据起始指针和四个平面包含的数据的大小。

为什么一个图像有四个平面,可以找一下YUV格式的一些详细介绍就可以明白。

当然,RGB格式是按照紧凑格式进行编码的,因此只有一个平面,也就是说只要设置src[0]就可以,src[1],src[2],src[3]都为NULL。

我们就在设置src[0]和srcStride[0]的地方做文章。

按照一般处理src[0]和srcStride[0]分别设置为起始图像数据的开始和图像每一行的像素个数。

那如果把src[0] 设置为 width * ( height - 1)    srcStride[0] = -height 结果会如何呢?是不是就会把图像倒过来呢?

实际确实如此。进行图像倒置的操作尽然如此简单。这样避免了人为再添加一次图像的反转操作,提高了编码的性能。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ffmpeg显示视频
项目最近需要实现播放视频功能,这个在上家公司就做过。虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此。在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成。
652 0
ASP.NET MVC4 音乐商店,Entity Framework 4.1 表名被自动转换成复数问题解决
 做ASP.NET MVC3 Music Store示例时,   EntityFramework4.1 下表名被自动转换成复数问题: 解决方案:    using System; using System.
777 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12078 0
VC常见问题与类型转换
如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。
892 0
基于ffmpeg的简单音视频编解码的例子
近日需要做一个视频转码服务器,对我这样一个在该领域的新手来说却是够我折腾一番,在别人的建议下开始研究开源ffmpeg项目,下面是在代码中看到的一 段例子代码,对我的学习非常有帮助。该例子代码包含音频的解码/编码和视频的编码/解码,其中主要用到编解码的libavcodec组件。
822 0
+关注
杨粼波
网游的老兵
1135
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载