基于ffmpeg的视频编解码,音频编解码播放

FFmpeg库简介

  • avcodec:编解码,包含
  • avformate: 封装格式处理
  • avfilter:滤镜特效处理
  • avdevice:输入输出设备
  • avutil:工具库
  • swresample:音频采样处理
  • swscale:视频像素格式转换,缩放等

##FFmpeg解码流程

  1. av_register_all(); //注册所有组件。
  2. AVFormatContext //获取上下文等信息//是封装格式上下文结构体,统领全局,保存视频文件的封装格式信息
  3. avformat_open_input(&pFormCtx,input_cstr,NULL,NULL) //打开输入文件
  4. avformat_find_stream_info(pFormCtx,NULL)////获取文件信息,
  5. AVStream,AVCodecContext获取流索引位置
  6. avcodec_find_decoder(avCodeCtx->codec_id)////查找解码器。
  7. avcodec_open2(avCodeCtx,avCode,NULL)//打开解码器。
  8. AVPacket,AVFrame//获取帧数据,申请空间
  9. av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodeCtx->width, pCodeCtx->height))//缓冲区分配内存
  10. avpicture_fill((AVPicture *)yuvFrame, out_buffer, AV_PIX_FMT_YUV420P, pCodeCtx->width, pCodeCtx->height);//初始化缓冲区
  11. while(av_read_frame(pFormatCtx,packet)//一阵一阵读取压缩的视频数据AVPacket
  12. avcodec_decode_video2(pCodeCtx, frame, &got_frame, packet)//解码AVPacket->AVFrame
  13. sws_scale//转为指定的YUV420P像素帧
  14. fwrite(yuvFrame->data[0], 1, y_size, fp_yuv);/向YUV文件保存解码之后的帧数据//AVFrame->YUV//一个像素包含一个Y
  15. 释放相关内存av_free_packet,fclose,av_frame_free,avcodec_close...


##FFmpeg解码的数据结构(主要的namespace)

  • AVFormatContext 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。

    • iformat:输入视频的AVInputFormat
    • nb_streams :输入视频的AVStream 个数
    • streams :输入视频的AVStream []数组
    • duration :输入视频的时长(以微秒为单位)
    • bit_rate :输入视频的码率
  • AVInputFormat 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

    • name:封装格式名称
    • long_name:封装格式的长名称
    • extensions:封装格式的扩展名
    • id:封装格式ID
    • 一些封装格式处理的接口函数
    • FFmpeg数据结构分析
  • AVStream 视频文件中每个视频(音频)流对应一个该结构体。

    • id:序号
    • codec:该流对应的AVCodecContext
    • time_base:该流的时基
    • r_frame_rate:该流的帧率
  • AVCodecContext编码器上下文结构体,保存了视频(音频)编解码相关信息。

    • codec:编解码器的AVCodec
    • width, height:图像的宽高(只针对视频)
    • pix_fmt:像素格式(只针对视频)
    • sample_rate:采样率(只针对音频)
    • channels:声道数(只针对音频)
    • sample_fmt:采样格式(只针对音频)
  • AVCodec 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

    • name:编解码器名称
    • long_name:编解码器长名称
    • type:编解码器类型
    • id:编解码器ID
    • 一些编解码的接口函数
  • AVPacket 存储一帧压缩编码数据。

    • pts:显示时间戳
    • dts :解码时间戳
    • data :压缩编码数据
    • size :压缩编码数据大小
    • stream_index :所属的AVStream
  • AVFrame存储一帧解码后像素(采样)数据。

    • data:解码后的图像像素数据(音频采样数据)。
    • linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。
    • width, height:图像的宽高(只针对视频)。
    • key_frame:是否为关键帧(只针对视频) 。
    • pict_type:帧类型(只针对视频) 。例如I,P,B。

猜你喜欢

转载自blog.csdn.net/qq_36449541/article/details/80572012