ffmpeg example decode_video 升级方案

以 MPEG-1 为例的视频解码例子,不含封装,只解析裸流

流程:

  1. 视频数据包初始化,av_packet_alloc

  2. 查找 MPEG-1 解码器, avcodec_find_decoder

  3. 数据解析器初始化,av_parser_init

  4. 解码结构初始化,avcodec_alloc_context3

  5. 打开解码器,avcodec_open2

  6. 打开视频文件,fopen

  7. 解码视频帧初始化,av_frame_alloc

  8. 循环
    读文件,fread
    解析数据包,av_parser_parse2
    解码视频帧,avcodec_send_packet,avcodec_receive_frame
    写文件(PGM图,p5),fopen,fwrite,fclose

  9. 关闭视频文件,fclose

  10. 关闭解析器,av_parser_close

  11. 释放解码器,avcodec_free_context

  12. 释放视频帧,av_frame_free

  13. 释放视频数据包,av_packet_free

升级方案:

  1. avcodec_find_decoder 可以调用其他解码器,解析其他裸流,如:h264、h265等
  2. 解码后的输出帧,可以按 yuv 分量保存成 yuv 视频文件
//Y, U, V (YUV420P)
FILE *fp = fopen(filepath_out, "wba");
for(int i=0;i<frame->height;i++){
   
    fwrite(frame->data[0]+pFrame->linesize[0]*i,1,frame->width,fp);
}
for(int i=0;i<frame->height/2;i++){
   
    fwrite(frame->data[1]+frame->linesize[1]*i,1,frame->width/2,fp);
}
for(int i=0;i<frame->height/2;i++){
   
    fwrite(frame->data[2]+frame->linesize[2]*i,1,frame->width/2,fp);
}
flcose(fp);

decode_video.c

/**
 * @file
 * video decoding with libavcodec API example
 *
 * @example decode_video.c
 */

#include <stdio.h>
#include <stdlib.h>
#
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值