Qt5.3里使用X264库将y4m文件进行压缩

来源:互联网 发布:医院预约管理系统php 编辑:程序博客网 时间:2024/05/01 13:40

    前段时间在Visual Studio里做过一次类似的Demo。现在尝试在Qt下使用X264对视频文件进行压缩。

    首先编译X264库,在网上搜索后,发现X264库在Windows下的编译,针对VS和Qt很大部分是相同的。VS里用到的lib文件,是在能用于Qt的那些库文件基础上再继续编译生成的。所以,我此处就跳过编译的步骤了,使用上次在VS里使用的库文件。这些用到的文件列表如下:

    


    其中benchmark.y4m是我们用以进行压缩的源视频文件。

    将以上文件拷贝黏贴到当前工程目录下,并将3个头文件包含到工程中的头文件夹下。在pro文件里进行如下设置:



    main.cpp


#include <iostream>#include <string>#include "stdint.h"extern "C"{#include "x264.h"#include "x264_config.h"#include "y4m.h"}#include <QDebug>int main(){    int iResult=0;    x264_t *pX264Handle=NULL;    x264_param_t *pX264Param=new x264_param_t;//    _assert(pX264Param);    x264_param_default_preset(pX264Param,                              "veryfast",                              "zerolatency");    pX264Param->i_threads=X264_SYNC_LOOKAHEAD_AUTO;    pX264Param->i_width=352;    pX264Param->i_height=288;    pX264Param->i_frame_total=0;    pX264Param->i_keyint_max=10;    pX264Param->i_bframe=5;    pX264Param->b_open_gop=0;    pX264Param->i_bframe_pyramid=0;    pX264Param->i_bframe_adaptive=X264_B_ADAPT_TRELLIS;    pX264Param->i_log_level=X264_LOG_DEBUG;    pX264Param->rc.i_bitrate=1024*10;    pX264Param->i_fps_den=1;    pX264Param->i_fps_num=10;    pX264Param->i_timebase_den=pX264Param->i_fps_num;    pX264Param->i_timebase_num=pX264Param->i_fps_den;    x264_param_apply_profile(pX264Param,x264_profile_names[0]);    int iNal=0;    x264_nal_t *pNals=NULL;    x264_picture_t *pPicIn=new x264_picture_t;    x264_picture_t *pPicOut=new x264_picture_t;    x264_picture_init(pPicOut);    x264_picture_alloc(pPicIn,                       X264_CSP_I420,                       pX264Param->i_width,                       pX264Param->i_height);    pPicIn->img.i_csp=X264_CSP_I420;    pPicIn->img.i_plane=3;    pX264Handle=x264_encoder_open(pX264Param);//    _ASSERT(pX264Handle);    FILE *pFile=fopen("test.264","wb");//    _ASSERT(pFile);    y4m_input_t *y4m_hnd=(y4m_input_t*)malloc(sizeof(y4m_input_t));    iResult=open_file_y4m("D:/Work/Test/build-TestX264_Qt-Desktop_Qt_5_3_0_MinGW_32bit-Debug/debug/benchmark.y4m",                          (hnd_t**)&y4m_hnd,                          pX264Param);    if(iResult<0)    {        qDebug()<<"Failed to open file!";        return 0;    }    int nFrames=::get_frame_total_y4m((hnd_t*)y4m_hnd);    for(int i=0;i<nFrames;i++)    {        read_frame_y4m(pPicIn,(hnd_t*)y4m_hnd,i);        if(i==0)            pPicIn->i_pts=i;        else            pPicIn->i_pts=i-1;        int frame_size=x264_encoder_encode(pX264Handle,                                           &pNals,                                           &iNal,                                           pPicIn,                                           pPicOut);        if(frame_size>0)        {            for(int i=0;i<iNal;++i)            {                fwrite(pNals[i].p_payload,                       1,                       pNals[i].i_payload,                       pFile);            }        }    }    x264_picture_clean(pPicIn);    x264_encoder_close(pX264Handle);    pX264Handle=NULL;    delete pPicIn;    pPicIn=NULL;    delete pPicOut;    pPicOut=NULL;    delete pX264Param;    pX264Param=NULL;    return 0;}

    编译、运行,debug窗口会出现很多编译过程中产生的信息,如下图:



    最后到编译路径的根目录下,可以发现test.264文件,大小是840K,源视频文件是44M,压缩效率是很理想的。

0 0
原创粉丝点击