ffmpeg解码视频并将原始数据转换为PPM格式进行保存

本文介绍了如何使用ffmpeg库解码视频文件,并将解码后的原始数据转换为PPM格式进行保存。通过注册编解码器,打开视频文件,检索流信息,初始化编解码器上下文,解码视频帧,然后进行格式转换,最终保存为PPM图片。运行代码后,每个帧都会被保存为一个PPM文件,可用ffplay查看。
摘要由CSDN通过智能技术生成

大致流程:

  1. 注册所有编解码器与解复用器(可省略)
  2. 初始化媒体上下文结构体
  3. 打开视频文件——avformat_open_input函数功能很强大,读取文件并给AVFormatContext赋值 
  4. 再检索流信息,使用avformat_find_stream_info来更新媒体上下文信息(下图为打印媒体信息,分别在调用avformat_find_stream_info的前后,数据上会有不同)
  5. 找到视频流并用其流所对应的编解码器信息来初始化编解码器上下文
  6. 用编解码上下文中的编解码器ID来查找编解码器
  7. 打开编解码器
  8. 申请空间存放转换前后的AVFrame:即解码之后的数据,并初始化SwsContext用于后续格式转换
  9. 解码 使用av_send_packet与av_receive_frame(). 这俩函数已经替代了avcodec_decode_video2()
  10. 格式转换并保存PPM数据

代码如下:

#include <iostream>
#include <stdlib.h>
#include <thread>
#define LOG(x) std::cout<<x<<std::endl;
#ifdef __cplusplus
extern "C" {
#endif
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>

#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#ifdef __cplusplus
}
#endif
int checkRet(int &ret,const char* error,const char* success){
    if(ret<0){
        LOG(error);
        return -1;
    }
    LOG(success);
}
int& getVideoStream(AVFormatContext* pFormatCtx,int &videoStream){
    for(int i = 0;i < pFormatCtx->nb_streams;i++){
        if(pFormatCtx->streams[i]->codecpar->codec_type 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值