首页 > 其他分享 >ffmpeg新旧函数对比

ffmpeg新旧函数对比

时间:2023-09-09 09:01:13浏览次数:38  
标签:pCodecCtx 函数 avcodec packet codec 新旧 av frame ffmpeg

从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:

if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){

new:

if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){

8. 'AVStream::codec': 被声明为已否决:

old:

pCodecCtx = pFormatCtx->streams[videoindex]->codec;

new:

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

9. 'avpicture_get_size': 被声明为已否决:

old:

avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)

new:

#include "libavutil/imgutils.h"

av_image_get_buffer_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height, 1)

10. '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);

11. '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

}
12. 'av_free_packet': 被声明为已否决:

old:

av_free_packet(packet);

new:

av_packet_unref(packet);
13. 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);

标签:pCodecCtx,函数,avcodec,packet,codec,新旧,av,frame,ffmpeg
From: https://www.cnblogs.com/kn-zheng/p/17688882.html

相关文章

  • Lookup函数3种职场约定俗成的用法!
    1职场实例小伙伴们大家好,今天我们来介绍一下LOOKUP函数的三种常见的职场用法:①提取各列最后一个文本;②提取各列最后一个数值;③提取各列最后一个非空单元格内容。2解题思路LOOKUP函数用于在查找范围中查询指定的查找值,并返回另一个范围中对应位置的值。此函数可以忽略空值、逻辑值和......
  • C++的纯虚函数和抽象类
    在C++中,可以将虚函数声明为纯虚函数,语法格式为:virtual返回值类型函数名(函数参数)=0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。包含纯虚函数的类称为抽......
  • C语言函数递归 --- 复习题(1)
    一.单选题:1.下列选项关于递归说法错误的是()A.存在限制条件,当满足限制条件时,递归停止B.每次递归调用后越来越接近递归的条件C.递归可以无限制递归下去D.递归层次太深容易出现栈溢出答案:C,这题错误的选项显而易见是C,我们之前将递归的时候就说过递归的两个要求,第一个是需要有限制条......
  • 函数重载的思考
    这个就是说,函数重载除了可以变量类型有差别外,输入的变量个数也可以有差别然后这张图就是说,还可以把强制转换用到重载函数里头(如果上面只要int,而下面的函数构造只有double的话)......
  • 无涯教程-JavaScript - IMLN函数
    描述IMLN函数以x+yi或x+yj文本格式返回复数的自然对数。复数的自然对数为-$$\ln(x+yi)=\ln\sqrt{x^2+y^2}+i\tan^{-1}\left(\frac{y}{x}\right)$$语法IMLN(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichy......
  • 所以说,java的“方法”有点儿类似于C++的"函数"吧
    两个语言的区别就是,C++如果函数写在下面的话,要在上面注释:而java的方法若写在下面的话,要加static,然后不管怎样,前面一定要加public......
  • 无涯教程-JavaScript - IMEXP函数
    描述IMEXP函数以x+yi或x+yj文本格式返回复数的指数。复数的指数为-$$e^{((x+yi)}=e^xe^{yi}=e^x(\cosy+i\siny)$$语法IMEXP(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwanttheexponential.Requir......
  • makefile 函数
    makefile函数1、findstring调用形式:$(findstringFIND,IN)函数功能:搜索字串“IN”,查找“FIND”字串。返回值:如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。函数说明:字串“IN”之中可以包含空格、[Tab]。搜索需要是严格的文本匹配。例子:$(findstringa,ab......
  • FFmpeg中的常用结构体分析
    一.前言在学习使用FFmpeg进行编解码时,我们有必要先去熟悉FFmpeg中的常用结构体,只有对它们的含义和用途有深刻的了解,我们才能为后面的学习打下坚实的基础。所以,这篇文章将会介绍这些常用的结构体有哪些,然后再介绍它们的具体用途。二.常用的结构体分析1.AVFormatContext:......
  • javascript | 变量、函数、属性的命名规则
    javascript标识符的命名规则变量、函数、属性的名字、或者函数的参数,都可称为标识符。标识符可以是按照下列格式规则组合起来的一个或者多个字符。第一个字符必须是一个字母、下划线_、或美元符号$。数字不可以作为标识符的首字符。其他字符可以是数字、字母、下划线_、或美......