精华内容
下载资源
问答
  • 视频编码器评测系统:VideoCodecRank

    万次阅读 多人点赞 2015-07-04 13:49:16
    视频编码器领域一直有个比较复杂的问题:mpeg2、divx、xvid、mpeg4、vp8、vp9、x264、openh264、x265等等这一系列编码器到底哪个好?而对于同一种视频编码器,又包括了各种各样的参数配置,这些配置对视频编码器的...

    视频编码器领域一直有个比较复杂的问题:mpeg2、divx、xvid、mpeg4、vp8、vp9、x264、openh264、x265等等这一系列编码器到底哪个好?而对于同一种视频编码器,又包括了各种各样的参数配置,这些配置对视频编码器的影响又是怎样的?为了研究这个问题,我和师弟们在课余时间开发了一个软件系统,专门用于评价视频编码器的性能。

    本文记录自己做的视频编码器性能评价的系统VideoCodecRank。本系统可以通过调整几种不同的维度的参数取值——视频内容、分辨率、编码器预设、码率来对视频编码器的性能进行评价和对比。对于每一个编码器,本系统可以遍历上述几种参数进行编码,并且记录编码视频图像质量和编码速度。通过本系统,可以全方位的对比视频编码器在各种条件下性能的优劣。在此还要感谢二位师弟的参与。目前在大家的合作下该系统基本功能刚开发完成,下一步打算继续测试和完善。


    系统地址: http://www.velab.com.cn/vcr/


    目前的状态

    目前本系统计算了下列编码器:

    x264-faster

    x264-medium

    x264-ultrafast

    x264-superfast

    x264-veryfast

    x264-fast

    x264-slow

    x264-slower

    x264-veryslow

    x265-faster

    x265-medium

    x265-ultrafast

    x265-superfast

    x265-veryfast

    x265-fast

    x265-slow

    x265-slower

    x265-veryslow

    f265-quality10

    f265-quality20

    DivX265-aqo2

    DivX265-aqo3

    DivX265-aqo4

    VP8-good-0

    VP8-good-1

    VP8-good-2

    VP8-good-3

    VP8-good-4

    VP8-good-5

    VP8-realtime

    DivX265-aqo1

    openh264-rc0

    openh264-rc1

    mpeg4

    mpeg1

    mpeg2

    xvid

    h263p

    theora

    VC1-adv0

    VC1-adv1

    VC1-adv2

    VC1-adv3

    VC1-adv4

    VC1-adv5

    VP9-good-0

    VP9-good-1

    VP9-good-2

    VP9-good-3

    VP9-good-4

    VP9-good-5

    VP9-realtime

    Intel-h264-speed

    Intel-h264-quality

    Intel-h264-balanced

    Intel-mpeg2-speed

    Intel-mpeg2-quality

    Intel-mpeg2-balanced

    使用了下列几种内容的测试视频:

    src01

    src02

    src04

    src05

    src06

    src08

    src11

    src12

    src14

    ducks

    park

    ped

    riverbed

    station2

    sunflower

    tractor

    每种内容的测试视频被缩放成了如下分辨率:

    640x360

    848x480

    1280x720

    1920x1080 (raw)

    每个测试视频设定了如下的BPP(可换算为码率):

    0.025

    0.05

    0.075

    0.1

    0.15

    0.2

    统计了如下视频图像质量指标:

    PSNR

    SSIM


    系统涉及到的参数

    本章主要介绍本视频编码器性能评价系统涉及到的参数。这些参数可以分为输入参数和评价参数。输入参数用于模拟不同的编码环境。而评价参数则用于在编码完成后统计编码性能。

    输入参数

    本节介绍该系统的输入参数。这些参数的变动通常会明显的影响视频编码器的性能。这些参数包括:视频内容,分辨率,编码器预设,码率。

    视频内容

    在相同视频质量的前提下,画面内容复杂、运动剧烈,要求的码率较高;画面内容简单、景物静止,要求的码率较低。本系统中我们选择ITU- BT.1788标准中提出的时间复杂度(TI)和空间复杂度(SI)来分别衡量视频的复杂程度。

    时间信息(TI)

    TI反映了一个序列画面随着时间的变化而变化的程度。画面内容运动程度剧烈的序列通常会有较高的TI值。它的计算方法是求序列的每一帧与前一帧图像的帧差,然后对帧差图像计算标准差。选这些标准差中的最大值为TI。它的计算公式如下所示:



    空间信息(SI)

    SI反映了一个序列画面的空间复杂程度。内容细节越多的序列通常会有较高的SI值。它的计算方法是对每一帧视频进行Sobel滤波,然后对滤波后图像计算标准差。选这些标准差中的最大值为SI。它的计算公式如下所示:

    分辨率

    分辨率指的是视频的尺寸。例如常见的分辨率有3840x2160 (4K), 1920x1080 (HD), 1280x720 (720P), 640x360 (360P)等。

    编码器和编码器预设

    不同编码器的编码效果相差很大。此外,同一编码器的预设(preset)对输出的图像质量有较大的影响。本系统将同一编码器的不同的预设也看作为不同的“编码器”。预设指的是预先定义好的一套编码器参数。编码器的预设一般是在速度和图像质量上寻求一个平衡点:速度快的预设一般情况下是以牺牲视频质量为代价的;视频质量好的预设一般情况下编码速度比较慢。例如x264编码器中按照编码速度从快到慢包含了10个预设:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo。

    码率

    码率是影响视频质量最主要的参数之一。其它条件形同的情况下,码率越大,视频质量越好。例如一个640x360的1Mbps的的视频的质量肯定好于一个640x360的500kbps的视频。但是不同分辨率的视频码率差别很大。例如我们很难断定一个1280x720的1Mbps的视频的质量是否高于一个640x360的500kbps的视频。为了去掉分辨率这个影响因子,我们在本文的系统中引入了一个新的变量——BPP(每像素比特数)。BPP的计算公式如下:
    BPP=bitrate/(framerate*reso_w*reso_h)
    其中,bitrate是视频的码率,framerate是视频的帧率,reso_w和reso_h分别代表视频的宽和高。

    BPP的意义是视频中一个像素点的数据量。例如我们假设帧率为25fps,上文中1280x720的1Mbps的视频的BPP取值为0.043,640x360的500kbps的视频的BPP取值为0.087。下表列出了BPP,码率和常见分辨率之间的对应关系。

    BPP与码率之间的对应关系

     

    对应码率(kbps)

    每像素比特数

    (bits/pixel)

    640x360

    848x480

    1280x720

    1920x1080

    0.025

    144

    254

    576

    1296

    0.05

    288

    508

    1152

    2592

    0.075

    432

    763

    1728

    3888

    0.1

    576

    1017

    2304

    5184

    0.15

    864

    1526

    3456

    7776

    0.2

    1152

    2035

    4608

    10368


    评价参数

    评价参数用于在编码完成后统计编码的质量情况。评价参数可以分为两类:质量评价参数和速度评价参数。

    质量评价参数

    编码质量评价主要通过全参考视频质量评价算法实现。全参考视频质量评价算法通过比较编码前原始视频与编解码后受损视频获得视频质量的评价结果。最常见的全参考视频质量评价模型为PSNR和SSIM。
    PSNR
    PSNR(峰值信噪比)是使用最为广泛的视频质量评价方法。它的计算公式为:
    其中L为图像灰度值范围,对于8bit位深的图像来说L=2^8-1=255;M*N图像块的MSE(均方误差)计算公式为:
    PSNR取值通常在20-40之间,取值越大代表图像质量越好。尽管PSNR计算简单,但是由于没有考虑到人类视觉感知特性,所以其评价结果与主观感受往往相差较大。
    SSIM
    SSIM(结构相似度)是zhou wang等人提出的一种常见的视频质量评价方法。该方法考虑了人类视觉感知特性,综合考虑了亮度、对比度以及结构的影响。它的计算公式如下所示。
    其中l(x,y)为亮度比较函数,c(x,y)为对比度比较函数,s(x,y) 为结构比较函数。这三个函数的具体计算方法可以参考相关文献。

    SSIM取值在0-1之间,取值越大代表图像质量越好。SSIM相对于PSNR来说更加符合人眼的主观感受,因此也是一种使用很广泛的视频质量评价方法。


    速度评价参数

    编码速度评价主要通过统计编码和解码的耗时(以毫秒为单位)来实现。


    系统运行原理

    本系统会根据输入的配置信息,遍历上文介绍的几种输入参数值,组合成不同的命令进行编码和评价工作。系统开始运行后,会按照顺序执行下面几步工作:
    (1) 对于每个输入的视频测试序列,对它的尺寸进行缩放,生成一系列不同分辨率的视频序列。
    (2) 对于每种分辨率的原始视频序列,选择不同的编码器准备编码。
    (3) 对于每种编码器,设置不同的码率进行编码,生成码流文件。随后解码生成的码流文件,得到受损的视频序列。
    (4) 对于每个受损视频序列,使用不同的视频质量评价方法进行质量评价,得到质量分数。

    上述逻辑下图所示。从图中可以看出本系统遍历参数的顺序如下:

    视频内容-->分辨率-->编码器-->码率-->客观质量评价方法

    当系统完成了一次客观质量评价算的计算之后,就会生成一条保存了当前实验参数的记录,并将该记录存储到数据库中。

    网站说明

    VideoCodecRank网站的结构如下图所示。整个网站除了首页之外包含了“结果集”、“编码器”、“视频序列”、“系统配置”、“关于”几个页面。这些页面之间的关系如下图所示。
     

    首页

    首页中包含了一张编码器的综合比较图表。其中蓝色横条代表了编码图像质量,而黄色横条代表了编码时间。可以拖动图表上方的滑动条调整下面几种参数选择不同的数据对编码器的性能进行排序。
    速度质量权重:目前只支持时间/质量权重设置为1或0。质量权重为1则按照编码器输出视频质量进行排序,时间权重为1则按照编码器消耗时间进行排序。
    分辨率:该选项可以选择输入视频的尺寸。
    码率:该选项可以选择输入视频的码率。注意码率是按照BPP(Bit Per Pixel,每像素比特数)为单位的。
    内容复杂度:该选项可以选择输入测试视频序列。注意输入的视频内容是按照时间复杂度TI或空间复杂度SI(这两个指标均取自于ITU BT.1788标准)进行排序的,以方便选择。
    首页的内容如下所示。
     

    结果集页面

    结果集页面中包含了系统中所有客观视频质量评价的结果。每一条实验记录包含了如下信息:
    编码器
    视频序列
    分辨率
    每像素比特数
    编码时间
    解码时间
    视频质量评价算法
    客观质量
    主观质量

    结果集页面的内容如下图所示。可以通过在下拉框中调整“编码器”,“视频序列”,“分辨率”,“每像素比特数”,“客观质量评价算法”几个参数来筛选符合特定条件的结果。


    编码器页面

    编码器页面中包含了系统中所有参与评价的编码器(注:对于包含多种预设的编码器,每种预设都算作一种编码器)。其中每一条记录包含了如下信息:
    编码器名称
    所属标准
    厂商
    版本
    编码器页面的内容如下图所示。单击编码器的名称可以进入编码器详细信息页面。

    编码器详细信息页面

    编码器详细信息页面包含了3个部分:编码器简介、编码器详细质量和编码器时间-质量权衡图。
    编码器简介部分内容如下所示。可以看出该列表列出了编码器的基本信息。
     
    编码器详细质量部分的内容如下图所示。可以通过选择参数(编码器、视频序列、分辨率、码率),列出特定条件下测试视频序列每一帧画面的图像质量信息(客观算法PSNR、SSIM等)。图表中横坐标为视频序列的帧序号,纵坐标为视频客观质量评价算法的值。
     
    编码器时间-质量权衡图的内容如下图所示。时间/质量权衡图中的每一个点代表了一个编码器,图表横坐标为编码时间,纵坐标为编码图像质量。由此可知,位于图表左边的编码器速度比较快,而位于图表上边的编码器图像质量比较好。“又快又好”的编码器都位于图表的左上方。该图表可以通过选择参数(视频序列、码率、分辨率、客观评价方法),列出特定条件下测试视频编码器的耗时信息和图像质量信息。
     

    视频序列页面

    视频序列页面中列表显示了系统中所有参与测试的原始视频序列信息。其中每一条记录包含如下信息:
    视频序列名称
    原始分辨率
    像素采样格式
    帧率
    帧数
    视频序列页面的内容如下图所示。单击视频序列的名称可以进入视频序列详细信息页面。
     

    视频序列详细信息页面

    视频序列详细信息页面包含了3项内容:视频序列预览、视频序列详细特性以及视频序列时间/空间复杂度对比图。
    视频序列预览部分内容如下所示。可以通过该功能预览测试视频的内容。
     
    视频序列详细特性部分内容如下图所示。可以通过该功能查看视频中每一帧图像的TI(Temporal perceptual Information)信息和SI(Spatial perceptual Information)信息。TI和SI两个指标取自于ITU BT.1788标准。TI越大,代表视频运动剧烈(时间上变化大);SI越大,代表视频内容复杂(空间上纹理多)。图表中横坐标为视频序列的帧序号,纵坐标为视频特性值。
     

    视频序列时间/空间复杂度对比图如下所示。图中每个点代表一个视频序列,图表横坐标为SI,纵坐标为TI。由此可知位于图表上方的视频序列运动比较剧烈,而位于图表右边的视频序列内容纹理比较复杂。最为简单的视频序列位于图表的右上角,最为简单的视频序列位于图表的左下角。



    系统配置页面

    系统配置页面的内容如下图所示。该页面中列出了系统配置的参数信息。例如显示了输入视频会被拉伸为哪几种分辨率,编码时候会选择哪些BPP,客观质量评价算法有哪些等等。




    雷霄骅
    leixiaohua1020@126.com
    http://blog.csdn.net/leixiaohua1020



    展开全文
  • 黄良13751838126 视频编码器实训 * P* P* 视频编码器实训 目录 第六节 公路收费系统故障与维护 P* 视频编码器实训 目录 第六节 公路收费系统故障与维护 P* 视频编码器实训 目录 第六节 公路收费系统故障与维护 P* ...
  • 视频编码器

    2013-03-04 16:01:45
    H264编码器是针对网络流媒体行业视频直播/监控要求而专门开发的嵌入式网络音视频编码器,该设备采用高性能的SoC芯片作为音视频编码核心的硬件平台;采用264视频编码算法、MP3音频编码算法,压缩率高
  • 最简单的基于FFMPEG的视频编码器(修正)

    千次下载 热门讨论 2014-06-08 16:43:09
    因此特地分离出了一个简单的视频编码器供学习之用。 该视频编码器实现了YUV420P像素数据编码为H.264码流 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备的API。十分适合FFmpeg的...
  • 最简单的视频编码器示例

    千次下载 热门讨论 2014-12-21 21:46:43
    该解决方案包含了几个常见的编码器的使用...simplest_vpx_encoder:最简单的基于libvpx的视频编码器 simplest_x264_encoder:最简单的基于libx264的视频编码器 simplest_x265_encoder:最简单的基于libx265的视频编码器
  • 最简单的基于FFMPEG的视频编码器

    热门讨论 2014-05-09 22:24:56
    因此特地分离出了一个简单的视频编码器供学习之用。 该视频编码器实现了YUV420P像素数据编码为H.264码流 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备的API。十分适合FFmpeg的...
  • hdmi编码器有有线HDMI编码器和无线HDMI编码器,HDMI编码器是视频编码器的一种设备信号接口,视频编码器中常用的有SDI编码器接口,HDMI编码器接口,VGA编码器接口,视频编码器可以可将SDI或HDMI视频源编码压缩成网络...

    hdmi编码器有有线HDMI编码器和无线HDMI编码器,HDMI编码器是视频编码器的一种设备信号接口,视频编码器中常用的有SDI编码器接口,HDMI编码器接口,VGA编码器接口,视频编码器可以可将SDI或HDMI视频源编码压缩成网络流,通过无线/有线网络,在互联网或局域网实现视频远距离高清传输/直播。
    设备的安装与连接
    正确连接电源、网线和视频输入源,设备开机启动在这里插入图片描述在这里插入图片描述
    网络连接和配置
    最简单的方式是,编码器通过有线方式接入网络或者直连计算机,使用设备默认管理IP地址(192.168.1.168)登录WEB页面进行设置;无线编码器为了方便操作,也可以通过WIFI终端连接设备自带的WIFI热点配置设备;如果使用无线网络推流,需先登录设备WEB页面对WIFI进行设置。
    在这里插入图片描述
    RTSP拉流
    使用解码器或者PC端播放器(如VLC),直接拉取编码器的RTSP流,RTSP流服务是持续开启的。
    在这里插入图片描述
    其他推流配置
    如果有需要,也可以同时配置设备推送RTMP、UDP、HLS等视频流。

    展开全文
  • 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

    万次阅读 多人点赞 2014-05-12 00:42:25
    本文介绍一个最简单的基于FFMPEG的视频编码器。该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据。编码器代码十分简单,但是每一行代码都很重要,适合好好研究一下。弄清楚了本代码也就基本弄清楚了FFMPEG...

    =====================================================

    最简单的基于FFmpeg的视频编码器文章列表:

    最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

    最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))

    最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)

    =====================================================


    本文介绍一个最简单的基于FFMPEG的视频编码器。该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据。编码器代码十分简单,但是每一行代码都很重要,适合好好研究一下。弄清楚了本代码也就基本弄清楚了FFMPEG的编码流程。目前我虽然已经调通了程序,但是还是有些地方没有完全搞明白,需要下一步继续探究然后补充内容。

    本程序使用最新版的类库(编译时间为2014.5.6),开发平台为VC2010。所有的配置都已经做好,只需要运行就可以了。


    流程

    下面附一张使用FFmpeg编码视频的流程图。使用该流程,不仅可以编码H.264的视频,而且可以编码MPEG4/MPEG2/VP8等等各种FFmpeg支持的视频。图中蓝色背景的函数是实际输出数据的函数。浅绿色的函数是视频编码的函数。


    简单介绍一下流程中各个函数的意义:

    av_register_all():注册FFmpeg所有编解码器。

    avformat_alloc_output_context2():初始化输出码流的AVFormatContext。

    avio_open():打开输出文件。

    av_new_stream():创建输出码流的AVStream。

    avcodec_find_encoder():查找编码器。

    avcodec_open2():打开编码器。

    avformat_write_header():写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。

    avcodec_encode_video2():编码一帧视频。即将AVFrame(存储YUV像素数据)编码为AVPacket(存储H.264等格式的码流数据)。

    av_write_frame():将编码后的视频码流写入文件。

    flush_encoder():输入的像素数据读取完成后调用此函数。用于输出编码器中剩余的AVPacket。

    av_write_trailer():写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)。


    代码

     

    /**
     * 最简单的基于FFmpeg的视频编码器
     * Simplest FFmpeg Video Encoder
     * 
     * 雷霄骅 Lei Xiaohua
     * leixiaohua1020@126.com
     * 中国传媒大学/数字电视技术
     * Communication University of China / Digital TV Technology
     * http://blog.csdn.net/leixiaohua1020
     * 
     * 本程序实现了YUV像素数据编码为视频码流(H264,MPEG2,VP8等等)。
     * 是最简单的FFmpeg视频编码方面的教程。
     * 通过学习本例子可以了解FFmpeg的编码流程。
     * This software encode YUV420P data to H.264 bitstream.
     * It's the simplest video encoding software based on FFmpeg. 
     * Suitable for beginner of FFmpeg 
     */
    
    #include <stdio.h>
    
    #define __STDC_CONSTANT_MACROS
    
    #ifdef _WIN32
    //Windows
    extern "C"
    {
    #include "libavutil/opt.h"
    #include "libavcodec/avcodec.h"
    #include "libavformat/avformat.h"
    };
    #else
    //Linux...
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    #include <libavutil/opt.h>
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #ifdef __cplusplus
    };
    #endif
    #endif
    
    
    int flush_encoder(AVFormatContext *fmt_ctx,unsigned int stream_index){
    	int ret;
    	int got_frame;
    	AVPacket enc_pkt;
    	if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities &
    		CODEC_CAP_DELAY))
    		return 0;
    	while (1) {
    		enc_pkt.data = NULL;
    		enc_pkt.size = 0;
    		av_init_packet(&enc_pkt);
    		ret = avcodec_encode_video2 (fmt_ctx->streams[stream_index]->codec, &enc_pkt,
    			NULL, &got_frame);
    		av_frame_free(NULL);
    		if (ret < 0)
    			break;
    		if (!got_frame){
    			ret=0;
    			break;
    		}
    		printf("Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n",enc_pkt.size);
    		/* mux encoded frame */
    		ret = av_write_frame(fmt_ctx, &enc_pkt);
    		if (ret < 0)
    			break;
    	}
    	return ret;
    }
    
    int main(int argc, char* argv[])
    {
    	AVFormatContext* pFormatCtx;
    	AVOutputFormat* fmt;
    	AVStream* video_st;
    	AVCodecContext* pCodecCtx;
    	AVCodec* pCodec;
    	AVPacket pkt;
    	uint8_t* picture_buf;
    	AVFrame* pFrame;
    	int picture_size;
    	int y_size;
    	int framecnt=0;
    	//FILE *in_file = fopen("src01_480x272.yuv", "rb");	//Input raw YUV data 
    	FILE *in_file = fopen("../ds_480x272.yuv", "rb");   //Input raw YUV data
    	int in_w=480,in_h=272;                              //Input data's width and height
    	int framenum=100;                                   //Frames to encode
    	//const char* out_file = "src01.h264";              //Output Filepath 
    	//const char* out_file = "src01.ts";
    	//const char* out_file = "src01.hevc";
    	const char* out_file = "ds.h264";
    
    	av_register_all();
    	//Method1.
    	pFormatCtx = avformat_alloc_context();
    	//Guess Format
    	fmt = av_guess_format(NULL, out_file, NULL);
    	pFormatCtx->oformat = fmt;
    	
    	//Method 2.
    	//avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file);
    	//fmt = pFormatCtx->oformat;
    
    
    	//Open output URL
    	if (avio_open(&pFormatCtx->pb,out_file, AVIO_FLAG_READ_WRITE) < 0){
    		printf("Failed to open output file! \n");
    		return -1;
    	}
    
    	video_st = avformat_new_stream(pFormatCtx, 0);
    	//video_st->time_base.num = 1; 
    	//video_st->time_base.den = 25;  
    
    	if (video_st==NULL){
    		return -1;
    	}
    	//Param that must set
    	pCodecCtx = video_st->codec;
    	//pCodecCtx->codec_id =AV_CODEC_ID_HEVC;
    	pCodecCtx->codec_id = fmt->video_codec;
    	pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
    	pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
    	pCodecCtx->width = in_w;  
    	pCodecCtx->height = in_h;
    	pCodecCtx->bit_rate = 400000;  
    	pCodecCtx->gop_size=250;
    
    	pCodecCtx->time_base.num = 1;  
    	pCodecCtx->time_base.den = 25;  
    
    	//H264
    	//pCodecCtx->me_range = 16;
    	//pCodecCtx->max_qdiff = 4;
    	//pCodecCtx->qcompress = 0.6;
    	pCodecCtx->qmin = 10;
    	pCodecCtx->qmax = 51;
    
    	//Optional Param
    	pCodecCtx->max_b_frames=3;
    
    	// Set Option
    	AVDictionary *param = 0;
    	//H.264
    	if(pCodecCtx->codec_id == AV_CODEC_ID_H264) {
    		av_dict_set(¶m, "preset", "slow", 0);
    		av_dict_set(¶m, "tune", "zerolatency", 0);
    		//av_dict_set(¶m, "profile", "main", 0);
    	}
    	//H.265
    	if(pCodecCtx->codec_id == AV_CODEC_ID_H265){
    		av_dict_set(¶m, "preset", "ultrafast", 0);
    		av_dict_set(¶m, "tune", "zero-latency", 0);
    	}
    
    	//Show some Information
    	av_dump_format(pFormatCtx, 0, out_file, 1);
    
    	pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
    	if (!pCodec){
    		printf("Can not find encoder! \n");
    		return -1;
    	}
    	if (avcodec_open2(pCodecCtx, pCodec,¶m) < 0){
    		printf("Failed to open encoder! \n");
    		return -1;
    	}
    
    
    	pFrame = av_frame_alloc();
    	picture_size = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);
    	picture_buf = (uint8_t *)av_malloc(picture_size);
    	avpicture_fill((AVPicture *)pFrame, picture_buf, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);
    
    	//Write File Header
    	avformat_write_header(pFormatCtx,NULL);
    
    	av_new_packet(&pkt,picture_size);
    
    	y_size = pCodecCtx->width * pCodecCtx->height;
    
    	for (int i=0; i<framenum; i++){
    		//Read raw YUV data
    		if (fread(picture_buf, 1, y_size*3/2, in_file) <= 0){
    			printf("Failed to read raw data! \n");
    			return -1;
    		}else if(feof(in_file)){
    			break;
    		}
    		pFrame->data[0] = picture_buf;              // Y
    		pFrame->data[1] = picture_buf+ y_size;      // U 
    		pFrame->data[2] = picture_buf+ y_size*5/4;  // V
    		//PTS
    		//pFrame->pts=i;
    		pFrame->pts=i*(video_st->time_base.den)/((video_st->time_base.num)*25);
    		int got_picture=0;
    		//Encode
    		int ret = avcodec_encode_video2(pCodecCtx, &pkt,pFrame, &got_picture);
    		if(ret < 0){
    			printf("Failed to encode! \n");
    			return -1;
    		}
    		if (got_picture==1){
    			printf("Succeed to encode frame: %5d\tsize:%5d\n",framecnt,pkt.size);
    			framecnt++;
    			pkt.stream_index = video_st->index;
    			ret = av_write_frame(pFormatCtx, &pkt);
    			av_free_packet(&pkt);
    		}
    	}
    	//Flush Encoder
    	int ret = flush_encoder(pFormatCtx,0);
    	if (ret < 0) {
    		printf("Flushing encoder failed\n");
    		return -1;
    	}
    
    	//Write file trailer
    	av_write_trailer(pFormatCtx);
    
    	//Clean
    	if (video_st){
    		avcodec_close(video_st->codec);
    		av_free(pFrame);
    		av_free(picture_buf);
    	}
    	avio_close(pFormatCtx->pb);
    	avformat_free_context(pFormatCtx);
    
    	fclose(in_file);
    
    	return 0;
    }
    


    结果

    软件运行截图(受限于文件体积,原始YUV帧数很少):


    编码前的YUV序列:


    编码后的H.264码流:



    下载


    Simplest FFmpeg Video Encoder


    项目主页

    SourceForge:https://sourceforge.net/projects/simplestffmpegvideoencoder/

    Github:https://github.com/leixiaohua1020/simplest_ffmpeg_video_encoder

    开源中国:http://git.oschina.net/leixiaohua1020/simplest_ffmpeg_video_encoder


    下载地址:

    http://download.csdn.net/detail/leixiaohua1020/7324115

    【修正】之前发现编码后的H.264码流与YUV输入的帧数不同。经过观察对比其他程序后发现需要调用flush_encoder()将编码器中剩余的视频帧输出。已经将该问题修正。

    CSDN下载地址(修正后):

    http://download.csdn.net/detail/leixiaohua1020/7466649

    PUDN下载地址(修正后):

    http://www.pudn.com/downloads644/sourcecode/multimedia/detail2605258.html

    SourceForge上已经更新。


    更新-1.1 (2015.1.03)=========================================

    增加了《最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)》中的simplest_ffmpeg_video_encoder_pure工程。

    CSDN下载地址: http://download.csdn.net/detail/leixiaohua1020/8322003


    更新-1.2 (2015.2.13)=========================================

    这次考虑到了跨平台的要求,调整了源代码。经过这次调整之后,源代码可以在以下平台编译通过:

    VC++:打开sln文件即可编译,无需配置。

    cl.exe:打开compile_cl.bat即可命令行下使用cl.exe进行编译,注意可能需要按照VC的安装路径调整脚本里面的参数。编译命令如下。

    ::VS2010 Environment
    call "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
    ::include
    @set INCLUDE=include;%INCLUDE%
    ::lib
    @set LIB=lib;%LIB%
    ::compile and link
    cl simplest_ffmpeg_video_encoder.cpp /link avcodec.lib avformat.lib avutil.lib ^
    avdevice.lib avfilter.lib postproc.lib swresample.lib swscale.lib /OPT:NOREF

    MinGW:MinGW命令行下运行compile_mingw.sh即可使用MinGW的g++进行编译。编译命令如下。

    g++ simplest_ffmpeg_video_encoder.cpp -g -o simplest_ffmpeg_video_encoder.exe \
    -I /usr/local/include -L /usr/local/lib \
    -lavformat -lavcodec -lavutil

    GCC:Linux或者MacOS命令行下运行compile_gcc.sh即可使用GCC进行编译。编译命令如下。

    gcc simplest_ffmpeg_video_encoder.cpp -g -o simplest_ffmpeg_video_encoder.out \
    -I /usr/local/include -L /usr/local/lib -lavformat -lavcodec -lavutil

    PS:相关的编译命令已经保存到了工程文件夹中


    CSDN下载地址:http://download.csdn.net/detail/leixiaohua1020/8444967

    SourceForge上已经更新。


    展开全文
  • 视频编码器工作流程

    千次阅读 2018-05-28 23:29:36
    1.视频编码器工作流程图a.视频为什么能进行压缩?因为存在时间和空间冗余...b.为甚要有编码器的存在?随着市场的需求,在尽可能低的存储情况下,获得好的图像质量和低宽带图像快速的传输...对视频进行压缩...c.编码...

    1.视频编码器工作流程图

    a.视频为什么能进行压缩?

    因为存在时间和空间冗余...

    b.为甚要有编码器的存在?

    随着市场的需求,在尽可能低的存储情况下,获得好的图像质量和低宽带图像快速的传输...对视频进行压缩...

    c.编码器的输入和输出是什么?

    输入:一帧帧的图像(包括各种格式),编码器寄存器的配置;输出:码流,数据,sps...??

    d.帧内预测:帧内预测模式中,预测块是基于已编码的重建块和当前块形成的...

    通过帧内相邻的已经重建的宏块(左边、左上、上边)预测当前编码宏块,这样做既可以有效的抑制了因运动补偿产生的误码扩散,同时提高了帧

    内预测的预测精度。

    e.帧间预测:利用已编码的视频帧和基于块的运动补偿的预测模式。运动补偿:根据求出的运动矢量,找到当前帧的块是从前一帧的哪个位置移动过来的,从而得到当前帧像素块的预测值。

    f.DCT(离散余弦变换):将图像的低频信号集中在DCT变换后的左上角的直流系数上,图像变换后的高频信号分配到其他交流系数上,视频图像的大部分信号集中在低频区域。

    g.量化:DCT之后大部分为浮点数据,在不降低重建后的视频质量的前提下,尽可能减少视频图像的编码长度,量化中丢弃一些不影响视频重建的不必要的数据。

    FQ:位量化后的值,QP:量化宽度,y:DCT变换后的原始数据,round:取整函数

    QP:取较大值时,FQ有较小的动态范围,经过熵编码后,码字较小,但依据FQ重建出来的参考帧会丢失较多参考细节,影响视频质量。反之能得到较清晰的视频图像。

    所以QP的值需要根据具体的带宽以及缓冲区的充盈度,在编码输出长度和图像质量之间找到一个平衡点。

    量化为0的部分是无法还原的。

    h.熵编码:提高视频压缩比,属于无损压缩,因此通过熵编码压缩后的视频信息可以在解码端无失真的重建出原始视频图像。(huffman,算数编码,游程编码)

    I.按LCU行划分slice,h.265 64x64的最大宏块   h.264 16x16的最大宏块  ;按编码后的字节数划分slice 片与片之间会有台阶。

    J.编码流程图:

    h.VOP:视频对象平面(VOP,Video Object Plane)是视频对象(VO)在某一时刻的采样.

    PEG-4在编码过程中针对不同VO采用不同的编码策略,即对前景VO的压缩编码尽可能保留细节和平滑;对背景VO则采用高压缩率的编码策略,甚至不予传输而在解码端由其他背景拼接而成。

    编码类型:

    1. 内部VOP(I-VOP),只用到当前帧的信息编码;强制I帧的情况
    2. 单向预测VOP(P-VOP),利用它前面的I或者P-VOP利用运动补偿技术来编码;
    3.双向预测VOP(B-VOP),利用前面和后面的I或者P-VOP利用运动补偿技术来编码。
    4.全景 VOP( S-VOP)用来编码 sprite对象
    展开全文
  • 2019年10月22日,由莫斯科国立大学(Moscow State University)举办的MSU世界视频编码器大赛成绩揭晓, 腾讯内部开源协同的V265编码器再创佳绩,一举拿下PSNR(峰值信噪比)/VMAF(Netflix开源的感知视频质量评估算法)...
  • 选择视频编码器的误区------傅德良

    千次阅读 2018-08-15 17:15:40
    大家好,我是傅德良,在Hulu主要负责的团队是在做音视频编解码和传输相关的一些优化和开发的工作,很高兴跟大家聊一聊对于视频编码器的对比和选择。   主要内容分为以下三个方面:   1,纷争的视频标准与视频...
  • h.264视频编码器

    千次阅读 2020-09-22 21:29:04
    本文首先介绍了多媒体技术发展的状况以及视频压缩的基本概念和方法,然后分析了H.264编解码器的基本结构和实现流程,本文在细致的分析了其编解码器后,对于解码器,编码器都采用了多种方式进行优
  • 视频编码器评估与参数优化

    千次阅读 2014-11-15 09:31:53
    视频编码器评估与参数优化是个比较麻烦的问题,主要原因是:编码器种类多,输入的参数繁多,参数的相互影响非线性,深入理解其实现需要投入巨大的精力或者不可能(对于商业产品而言)。而另一方面,评估和选择编码器...
  • 基于x264编码器(公认的最高质量的H.264编码器的实现)创造世界上最好的HEVC(h.265)视频编码器
  • 关于视频编码器的作用详细介绍

    千次阅读 2017-07-10 10:25:00
    在实际生活中,视频编码器有十分重要的作用。下面就讲讲视频编码器作用。  视频编码器作用 视频编码器在监控系统中的作用是:将前端摄像机、拾音器等设备采集到的音视频信号经过压缩编码,通过网络传输到后端的...
  • 因此特地分离出了一个简单的视频编码器供学习之用。 此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行了升级。升级后编码器实现了YUV420P像素数据编码为H.265码流。 尽管该视频编码器的代码十分...
  • 几种视频编码器的编译及使用方法

    千次阅读 2014-12-22 08:57:35
    转载自:最简单的视频编码器:编译 最近研究了一下几种常见的视频编码器:x264,x265,vpx。本文简单记录一下它们的编译方法。 x264,x265,vpx这三个开源的视频编码器可以说是当今“最火”的视频编码器...
  • 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码 检测视频编码
  • 最简单的视频编码器:基于libx264(编码YUV为H.264)

    万次阅读 多人点赞 2014-12-23 00:18:18
    本文记录一个最简单的基于libx264的H.264视频编码器。此前记录的H.264编码器都是基于FFmpeg调用libx264完成编码的,例如: 《最简单的基于FFMPEG的视频编码器(YUV编码为H.264)》相比与上文中的编码器,本文记录的...
  • 最近研究了一下几种常见的视频编码器:x264,x265,vpx。本文简单记录一下它们的编译方法。 x264,x265,vpx这三个开源的视频编码器可以说是当今“最火”的视频编码器。x264现在占据着H.264视频编码器的半壁江山;x...
  • 最简单的视频编码器:基于libx265(编码YUV为H.265)

    万次阅读 多人点赞 2014-12-23 17:36:43
    本文记录一个最简单的基于libx265的H.265(HEVC)视频编码器。此前记录的编码器是通过FFmpeg调用libx265完成编码的,例如:《最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))》相比与上文中的编码器,...
  • H264_Lite高清视频编码器/解码器IP核 我公司针对图传系统(如无人机无线图传),推出H.264高清视频编解码器IP核。可以在FPGA/ASIC上集成使用。 H264_Lite视频编解码器(encoder&amp;amp;decoder)由硬件描述...
  • H.264 视频编码器的研究与分析

    千次阅读 2017-06-23 16:35:49
    H.264 视频编码器的研究与分析 郝瑞林 北京邮电大学网络技术研究院 北京(100876) E-mail:ruilynn@gmail.com 摘 要:随着市场对多媒体信息传输需求的增加,多媒体信息传输如何适应不同信道传输特性的...
  • 目前webrtc在移动端,的编码器实现,...如果不支持,则默认通过VP8软件视频编码器; 1:Android 在Android端,默认编译不包括OPENH264和FFmpeg,需要通过参数设置将这两个库可以编译到Android端; 1: class Vi
  • OpenCV视频编码器参数修改

    千次阅读 2019-12-01 16:04:32
    视频编码 h264视频编码参考代码,outputVideo.write(frame) 需要有视频raw数据; #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> int main(){ // init cv::Video...
  • /** * 初始化。 * * @param destUrl 目标url * @param w 宽 * @param h 高 * @return 结果 */ public static native int init(String destUrl, int w, int h);... public static native int push(byte[] bytes,...
  • 设计HEVC/H.265硬件视频编码器难点

    千次阅读 2015-07-29 15:26:45
    设计HEVC/H.265硬件视频编码器的和其他复杂的数字信号处理相比,视频编码标准本身并不复杂,在制定标准时候已经考虑到可实现性问题。 但视频编码有其自身的特点,主要特点在于单位时间需要处理的数据量十分庞大,...
  • 如何比较视频编码器的性能

    千次阅读 2015-03-01 20:17:25
    在做编码器性能比较时需要考虑以下指标 1、 视频质量-码率 二者要结合起来考虑,可以称之为quality-size比。 视频质量无疑是最重要的考量指标,视频质量的比较可以采用主观评价方法,也可以采用客观评价方法。 2、 ...
  • 本文记录一个最简单的基于libvpx的VP8视频编码器。这个例子是从官方的示例代码中精简出来的例子。我发现与H.264不同,VP8的裸流(即不包含封装格式的纯视频数据流)是不能播放的。换言之,VP8的裸流必须存放在容器中...
  • 视频编码器ffdshow和x264vfw

    热门讨论 2010-09-14 12:03:20
    ffdshow和x264vfw,各种编码方式仅在其中。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,476
精华内容 59,790
关键字:

视频编码器