博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg编解码视频导致噪声增大的一种解决方法
阅读量:6905 次
发布时间:2019-06-27

本文共 1562 字,大约阅读时间需要 5 分钟。

一、前言

       ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了。公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理。然而,在观察编码后的视频质量时,发现图像帧出现了较为明显噪声,类似于水面波纹一般散发开来,在运动场景下尤为明显。初步怀疑应该是码率太低导致的画面失真。于是增大码率重新编码一次,噪声仍然很明显。基本上可以排除是码率太低的问题。

       仔细观察原片,也可发现有类似的图像噪声出现,但是微乎其微到几乎不可察觉。于是再次怀疑是ffmpeg在编解码的过程中,将这个噪声放大了,导致最终产出的视频出现了明显的噪声干扰。而代码中我们正好用了ffmpeg实现的swscale()方法。在正式编码之前,我们需要用该方法将YUV数据转换为RGB数据来处理。因此,此处调用正是症结所在。

二、解决方案

      前面说了,在正式编码之前我们需要将YUV数据转换为RGB来渲染。既然是swscale()方法的原因,那么是否可以在渲染的时候通过多重采样来降低图形噪声呢?事实上还是too young too simple。开启多重采样还是没有卵用。我们的渲染库又必须采用RGB格式的数据,难道不用swscale()方法么?是否有替代品呢?

      这么一搜索还真有!google开源的
libyuv库正是这样一个替代品,可以用于在RGB和YUV之间进行转换:
libyuv is an open source project that includes YUV scaling and conversion functionality.

      于是马上下载下来进行测试。

git clone https://chromium.googlesource.com/libyuv/libyuv

  网上关于libyuv的资料貌似比较少,官方也没看到什么文档。好在项目也不大,把头文件看一看,基本上可以了解具体的使用方法的。使用CMake生成VS编译工程,可以产出静态库和动态库两种类型:

      使用实例:

      

// yuv420p -> bgr24if (mOutputFormat == AV_PIX_FMT_BGR24){	I420ToRGB24(src_frame->data[0], 		src_frame->linesize[0], 		src_frame->data[1], 		src_frame->linesize[1], 		src_frame->data[2], 		src_frame->linesize[2],		scale_frame->data[0],		mOutputWidth*3,		mOutputWidth,		mOutputHeight);}// bgr24 -> yuv420pelse if (mOutputFormat == AV_PIX_FMT_YUV420P){	RGB24ToI420(src_frame->data[0],		src_frame->linesize[0],		scale_frame->data[0],		scale_frame->linesize[0],		scale_frame->data[1],		scale_frame->linesize[1],		scale_frame->data[2],		scale_frame->linesize[2],		mOutputWidth,		mOutputHeight);}else { 	return false;}

  接口非常简洁明了。编码的视频效果对比如下(上图是libyuv实现,下图是ffmpeg的swscale实现):

      可以看出来,下图有类似于水面波纹一样的噪声,而上图则几乎不可见。

三、参考链接

1. 

转载地址:http://enldl.baihongyu.com/

你可能感兴趣的文章
关于main()函数的小技巧
查看>>
phpnow配置
查看>>
使用mailx发送邮件
查看>>
Webbrowser中模拟连接点击(非鼠标模拟)
查看>>
HDU 1049 Climbing Worm(水题)
查看>>
类 不包含 方法的定义
查看>>
Servlet与JSP有什么区别?
查看>>
OK335xS psplash Screen 移植
查看>>
drop.delete.trauncat的区别
查看>>
状态栏 隐藏问题
查看>>
IIS
查看>>
ul li css 做横向菜单
查看>>
Android深入浅出系列之Socket—Socket编程(二)
查看>>
[原创]对于运行ASP.NET程序时,提示:无法启动程序“http://localhost:3532/Default.aspx”。的解决办法...
查看>>
[转载]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法...
查看>>
sencha touch 2--audio
查看>>
详细介绍Linux /etc/group文件
查看>>
解决w3wp.exe内存占用过高的方法
查看>>
basic4android 开发教程翻译(五)Android进程及activitys 生存周期
查看>>
设计模式--工厂方法模式
查看>>