ffmpeg实战教程(一)Mp4,mkv等格式解码为h264和yuv数据

FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。而网上对这些功能的使用大多是基于命令行的。这不利于我们深入学习定制化ffmpeg,今后我将写一系列的用代码实现这些功能的教程供大家学习。这系列的前部分我打算写在windows上的实现,后部分写移植到Android系统上实现。
代码实现的前提是对ffmpeg源码有一定的了解,如果你不了解可以看这里
ffmpeg源码简析(一)结构总览

下面进入正题,用FFmpeg实现Mp4,mkv等格式的解码。解码为h264和YUV数据并存在文件中。

先上运行结果图,可见生成了两个文件即是解码之后的数据:
h264比YUV文件小了这么多。h264压缩技术真是杠杠的。新一代压缩技术H265更是杠杠的以后给大家介绍这块。
这里写图片描述

先介绍整个流程,然后给出源代码。

1.把名称为ws.mp4的视频拷贝进项目跟目录
然后创建两个解码后的输出文件 代码如下:

        char filepath[]="ws.mp4";

    FILE *fp_yuv=fopen("output.yuv","wb+");  
    FILE *fp_h264=fopen("output.h264","wb+");

2.然后就是初始化一些组件

av_register_all();//注册所有组件
    avformat_network_init();//初始化网络
    pFormatCtx = avformat_alloc_context();//初始化一个AVFormatContext

3.打开视频文件,并获取视频信息,选择解码器

avformat_open_input(&pFormatCtx,filepath,NULL,NULL)

avformat_find_stream_info(pFormatCtx,NULL)

avcodec_find_decoder(pCodecCtx->codec_id)

4.打开解码器,开始解码

avcodec_open2(pCodecCtx, pCodec,NULL)

avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet)

注意:当av_read_frame()循环退出的时候,实际上解码器中可能还包含剩余的几帧数据。
因此需要通过“flush_decoder”将这几帧数据输出。“flush_decoder”功能简而言之即直接调用avcodec_decode_video2()获得AVFrame,而不再向解码器传递AVPacket。代码如下:

    while (1) {
        ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);
        if (ret < 0)
            break;
        if (!got_picture)
            break;
        sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame
  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值