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

    前段时间在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,压缩效率是很理想的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值