当前位置: 首页 > news >正文

ffmpeg新旧函数对比

搬运博客园“kn-zheng”大佬博客
从FFmpeg 3.0 开始 , 使用了很多新接口,对不如下:

1、avcodec_decode_video2() 原本的解码函数被拆解为两个函数avcodec_send_packet()和avcodec_receive_frame() 具体用法如下:

old:
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, pPacket);
new:
avcodec_send_packet(pCodecCtx, pPacket);
avcodec_receive_frame(pCodecCtx, pFrame);

2、 avcodec_encode_video2() 对应的编码函数也被拆分为两个函数avcodec_send_frame()和avcodec_receive_packet() 具体用法如下:

old:
avcodec_encode_video2(pCodecCtx, pPacket, pFrame, &got_picture);
new:
avcodec_send_frame(pCodecCtx, pFrame); avcodec_receive_packet(pCodecCtx, pPacket);

3、avpicture_get_size() 现在改为使用av_image_get_size() 具体用法如下:

old:
avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

4、 avpicture_fill() 现在改为使用av_image_fill_arrays 具体用法如下:

old:
avpicture_fill((AVPicture *)pFrame, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new: //最后一个参数align这里是置1的,具体看情况是否需要置1
av_image_fill_arrays(pFrame->data, pFrame->linesize, buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height,1);

5、关于codec问题有的可以直接改为codecpar,但有的时候这样这样是不对的,所以我也还在探索,这里记录一个对pCodecCtx和pCodec赋值方式的改变

old:
pCodecCtx = pFormatCtx->streams[video_index]->codec; 
pCodec = avcodec_find_decoder(pFormatCtx->streams[video_index]->codec->codec_id);
new:
pCodecCtx = avcodec_alloc_context3(NULL)avcodec_parameters_to_context(pCodecCtx,pFormatCtx->streams[video_index]->codecpar);
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

6、PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P

7、‘AVStream::codec’: 被声明为已否决:

old:
pCodecCtx = pFormatCtx->streams[videoindex]->codec;
new:
pCodecCtx = avcodec_alloc_context3(NULL)avcodec_parameters_to_context(pCodecCtx, pFormatCtx->streams[videoindex]->codecpar);

8、 ‘avpicture_fill’: 被声明为已否决:

old:
avpicture_fill((AVPicture *)pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);
new:
av_image_fill_arrays(pFrameYUV->data, pFrameYUV->linesize, out_buffer, AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1);

9、‘avcodec_decode_video2’: 被声明为已否决:

old:
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet); //got_picture_ptr Zero if no frame could be decompressed
new:
ret = avcodec_send_packet(pCodecCtx, packet);
got_picture = avcodec_receive_frame(pCodecCtx, pFrame); //got_picture = 0 success, a frame was returned //注意:got_picture含义相反
或者:
int ret = avcodec_send_packet(aCodecCtx, &pkt);
if (ret != 0)
{
prinitf("%s/n","error");
return;
} 
while( avcodec_receive_frame(aCodecCtx, &frame) == 0)
{
//读取到一帧音频或者视频 //处理解码后音视频 frame
}

10、‘av_free_packet’: 被声明为已否决:

old:
av_free_packet(packet);
new:
av_packet_unref(packet);

11、avcodec_decode_audio4:被声明为已否决:

old:
result = avcodec_decode_audio4(dec_ctx, out_frame, &got_output, &enc_pkt);
new:
int ret = avcodec_send_packet(dec_ctx, &enc_pkt);
if (ret != 0)
{
prinitf("%s/n","error");
} 
while( avcodec_receive_frame(dec_ctx, &out_frame) == 0)
{
//读取到一帧音频或者视频
//处理解码后音视频 frame
}
旧接口av_register_all()------------新版不需要注册
PKT_FLAG_KEY ---------------->AV_PKT_FLAG_KEY
AV_CODEC_CAP_DELAY----->AV_CODEC_CAP_DELAY
guess_format ------------>av_guess_format 
av_alloc_format_context ---------->avformat_alloc_output_context 
CODEC_TYPE_VIDEO ----------------->AVMEDIA_TYPE_VIDEO
CODEC_TYPE_AUDIO ---------------->AVMEDIA_TYPE_AUDIO
audio_resample_init ----------------->av_audio_resample_init 
PIX_FMT_YUV420P -> AV_PIX_FMT_YUV420P
AVStream::codec     被声明为已否决
‘avpicture_get_size’: 被声明为已否决
新的API中将AVStream结构体中codec作了遗弃处理,当需要解码器上下文的时候,需要用AVCodecParameters去转化,解决方案是如下
av_free_packet(packet)--------------------> av_packet_unref(packet);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微信视频号的视频怎么下载到本地?快速教你下载视频号视频
  • 算法训练营day11 栈与队列(栈的应用,单调队列,优先队列)
  • SSRF漏洞深入利用与防御方案绕过技巧
  • 多表联合的查询(实例)、对于前端返回数据有很多表,可以分开操作、debug调试教程
  • Linux开发讲课37--- ARM的22个常用概念
  • 初步探究Rust生态与图形界面编程
  • zookeeper在哪里能用到
  • Python-PLAXIS自动化建模技术与典型岩土工程
  • 【web】-sql注入-login
  • VSCode remote无法链接
  • 使机器人在执行任务倒快递
  • 【数智化CIO展】三一集团CIO吕青海:企业高速发展“数字化”是基础,“数智化”是升华...
  • MySQL黑马教学对应视屏笔记分享之聚合函数,以及排序语句的讲解笔记
  • 查询(q_proj)、键(k_proj)和值(v_proj)投影具体含义
  • CSS上下悬浮特效
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018一半小结一波
  • Android开源项目规范总结
  • axios 和 cookie 的那些事
  • codis proxy处理流程
  • golang 发送GET和POST示例
  • IP路由与转发
  • Java读取Properties文件的六种方法
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js递归,无限分级树形折叠菜单
  • scala基础语法(二)
  • Vue2.x学习三:事件处理生命周期钩子
  • 京东美团研发面经
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 十年未变!安全,谁之责?(下)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ionic异常记录
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Linux(Source Insight安装及工程建立)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (CPU/GPU)粒子继承贴图颜色发射
  • (HAL库版)freeRTOS移植STMF103
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (编译到47%失败)to be deleted
  • (补充)IDEA项目结构
  • (第27天)Oracle 数据泵转换分区表
  • (分享)自己整理的一些简单awk实用语句
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四)Controller接口控制器详解(三)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (自用)网络编程
  • .Net Core 笔试1
  • .Net MVC + EF搭建学生管理系统
  • .net 程序发生了一个不可捕获的异常
  • @Bean有哪些属性
  • @reference注解_Dubbo配置参考手册之dubbo:reference