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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL8之mysql-community-embedded-compat的作用

MySQL8中的mysql-community-embedded-compat包的作用主要是提供MySQL服务器作为嵌入式库时的兼容性支持,特别是对于那些使用库版本18的应用程序。嵌入式MySQL服务器允许开发者将MySQL数据库直接嵌入到他们的应用程序中,而无需运行独立的MySQL服务器进程。…

Transformer 论文通俗解读:FFN 的作用

在经过前面3节关于 Transformer 论文的解读之后,相信你对提出 Transformer 架构的这篇论文有了一定的了解了,你可以点击下面的链接复习一下前3节的内容。 《Attention is all you need》通俗解读,彻底理解版:part1 《Attention …

合合信息“大模型加速器”亮相2024世界人工智能大会

文章目录 📑引言一、大模型发展的挑战数据稀缺问题 二、大模型“加速器”解决方案概述文档解析引擎的特征 三、文档解析引擎的优势3.1 高速处理能力3.2 智能理解文档结构3.3 多种数据类型支持3.4 高精度数据提取3.5 应用广泛,适应性强 四、复杂图表解析4…

Auslogics Disk Defrag Pro v11激活版下载、安装、使用教程 (磁盘碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系统的磁盘碎片整理工具,它可以快速整理磁盘碎片,使磁盘空间更加整洁,显著提升电脑的运行速度。该软件无需任何分析阶段,并且速度比大多数其他碎片整理软件更快。它可以帮助…

stm32 开发板可以拿来做什么?

STM32开发板可以用来做许多不同的事情,具体取决于您的应用需求和编程能力。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学,敲个22就可…

详解太阳能控制器PWM / MPPT极简方案其设计要点,台湾远翔FP7209升压24V,30V,36V,42V,48V

文章目录 前言 一、单节电池升压9V、12V、24V方案 二、单节电池升压30V,36V,42V,48V方案 三、芯片介绍 FP7209X与FP7209M的区别: 四、单节电池升压成为市面上太阳能控制器首选的原因? 总结 前言 太阳能是一种环保…

定时器TIM配置微妙延时函数

定时器TIM配置微妙延时函数 文章目录 定时器TIM配置微妙延时函数开胃小菜(BOOT0、BOOT1)Boot0Boot1(如果有) 三种定时器高级控制定时器(TIM1,TIM8)通用定时器(TIM2, TIM3, TIM4, TIM…

linux命令: rsync的使用

使用rsync同步本地文件夹到远程目录 rsync -zvrt /localdir/ -e ssh -p 30000 rootip:/remotedir/rsync -zvrt /localdir/ /remotedir/ 远程备份 rsync -avlR --delete -e ssh -p 3231 tangboqi221.122.114.27:backup ~/backup/ R表示保留目录结构,如果不保留…

基于Intel Chainer 和姿势检测的动作识别(人体、面部、手部关键点识别动作识别)

项目概述 目标 开发一个能够实时或近实时识别特定动作的系统,如运动姿势、表情变化或手势控制。实现对人体关键点的精确追踪,以便于分析和理解人的动态行为。 技术栈 Intel硬件:可能使用Intel的高性能计算平台,如Xeon处理器或…

【国潮】国产化系统甲方问题总结

持续更新。。。。。。。。。。。。。。。 【国潮】国产化系统甲方问题总结 1. 安全性问题2. 可靠性和稳定性问题3. 性能问题4. 符合军事标准问题5. 兼容性和集成问题6. 维护和升级问题7. 项目管理问题8. 隐私和合规性问题9. 灾难恢复和备份问题10. 技术支持和培训问题 引言&am…

zookeeper的shell操作

一:启动拽库的shell命令行 zkCli.sh -server localhost:2181 退出:quit 二:查询所有的命令 help 三:查询对应的节点 --查询zk上的根节点 ls / ls /zookeeper 四:查询对应节点的节点信息(节点的元数据&a…

[AI 大模型] 阿里巴巴 通义千问

文章目录 [AI 大模型] 阿里巴巴 通义千问简介模型架构发展新技术和优势示例 [AI 大模型] 阿里巴巴 通义千问 简介 阿里巴巴的 通义千问 是由阿里云开发的一款大型语言模型,旨在为用户提供高效、智能的自然语言处理服务。 通义千问能够处理多种语言输入&#xff0c…

c# Bitmap

在C#中,Bitmap 类是一个表示位图图像的类,它属于 System.Drawing 命名空间。Bitmap 类是从 Image 类派生的,因此它继承了 Image 类的所有属性和方法,并添加了一些专门用于处理位图的功能。 以下是关于 Bitmap 类的一些基本信息和…

Supervisord控制进程举例

当使用Supervisord来控制进程时,通常会配置一个或多个进程组(program group),每个进程组负责监控和管理一个特定的进程或应用程序。以下是一个具体的例子: 假设我们有一个简单的 Flask 应用程序,我们希望使…

免杀笔记 ---> Session0--DLL注入

刚更新完上一篇,于是我们就马不停蹄的去跟新下一篇!! Session0注入 :: 各位看官如果觉得还不错的可以给博主点个赞💕💕 这次,我把这个脚本直接传到Github上了 喜欢的师傅点个Star噢…

深入理解JS中的防抖节流

在Web开发中,防抖(Debouncing)和节流(Throttling)是两种常用的优化技术,用于提高页面性能和用户体验。它们通过限制函数执行的频率来减少计算资源的消耗,尤其是在处理频繁触发的事件时,如窗口大小调整、滚动、键盘输入等。 1、防抖(Debouncing) 防抖技术的核心思想是…

风景园林工程设计乙级资质业绩要求案例分析

项目数量与规模 数量要求:企业需要提供一定数量的已完成风景园林设计项目案例,这个数量可能依据具体政策而有所不同,但通常需要完成多个项目以展示设计团队的综合能力。 规模要求:项目规模需达到乙级资质标准所规定的级别&#…

【C++报错已解决】Dangling Pointer

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:使用智能指针2.2 方法二…

本地部署,GFPGAN: 实用的面部修复算法

目录 什么是 GFPGAN? 技术原理 主要功能 应用场景 本地安装 运行结果 结语 Tip: 在图像处理和计算机视觉领域,面部修复是一个重要且具有挑战性的研究方向。随着深度学习技术的不断进步,许多新的算法被提出,用于…

C# 根据日期对mysql数据库数据筛选的一些操作函数

在C#中,根据日期筛选MySQL数据库中的数据是一个常见的操作。以下是一些基于日期的数据筛选操作函数示例: 1. 筛选特定日期的数据 public List<YourDataType> GetDataBySpecificDate(DateTime specificDate) {List<YourDataType> dataList = new List<YourDa…