FFmpeg关键函数介绍

简介: FFmpeg关键函数介绍



1. av_register_all()——弃用


初始化 libavformat 和注册所有的复用器、解复用器和协议处理器。如果不调用这个函数,可以调用下面的三个函数来选择支持的格式。• 注册复用器的函数是av_register_output_format()。• 注册解复用器的函数是av_register_input_format()。• 注册协议处理器的函数是ffurl_register_protocol()。注:FFmpeg4.0 以上的版本,这个函数已经被废弃。

2. avformat_alloc_context()


当使用AVFormatContext时, avformat_alloc_context()函数用来对AVFormatContext分配空间,

AVFormatContext *avFormatContext = avformat_alloc_context();//获取上下文

3.avformat_open_input()


avformat_open_input的主要功能是打开一个文件,读取header,不会涉及打开编码器。

与之对应的是通过avformat_close_input函数关闭文件。

示例代码:

int error;
    //打开视频地址并获取里面的内容(解封装)
    error = avformat_open_input(&avFormatContext, inputPath, NULL, NULL);
    if (error < 0) {
        LOGE("打开视频失败")
        return;
    }

4.avformat_find_stream_info()


读取音视频数据来获取一些相关的信息。

示例代码:

if (avformat_find_stream_info(avFormatContext, NULL) < 0) {
        LOGE("获取内容失败")
        return;
    }

5.av_read_frame()


在FFmpeg中av_read_frame函数的作用是读取码流中的若干音频帧或者1帧数据。在解码视频时,每解码一个视频帧,需要先调用av_read_frame获取1帧视频的压缩数据,然后才能对该数据进行解码。

示例代码:

while(1) {
        int ret = av_read_frame(avFormatContext, packet);
        if (ret != 0) {
            av_strerror(ret, buf, sizeof(buf));
            LOGE("--%s--\n", buf);
            av_packet_unref(packet);
            break;
        }
        if (ret >= 0 && packet->stream_index != mVideoStreamIdx) {
            av_packet_unref(packet);
            continue;
        }
         //省略...
}

6.avcodec_send_packet


发送数据到ffmepg,放到解码队列中

// 发送待解码包
            int result = avcodec_send_packet(mAvContext, packet);

7.avcodec_receive_frame()


将成功的解码队列中取出1个frame

示例代码:

while (result >= 0) {
                result = avcodec_receive_frame(mAvContext, frame);
                if (result == AVERROR_EOF)
                    break;
                else if (result == AVERROR(EAGAIN)) {
                    result = 0;
                    break;
                } else if (result < 0) {
                    av_log(NULL, AV_LOG_ERROR, "Error decoding frame\n");
                    av_frame_unref(frame);
                    break;
                }
               // 省略...
 
 }

8.avcodec_open2


打开解码器

示例代码:

// 打开解码器
    if (avcodec_open2(mAvContext, mVcodec, NULL) != 0){
        LOGE("打开失败")
        return;
    }

9. sws_getContext()


分配和返回一个 SwsContext。其原型如下:

struct SwsContext *sws_getContext(int srcW, int srcH,

enum AVPixelFormat srcFormat,

int dstW, int dstH,

enum AVPixelFormat dstFormat,

int flags,

SwsFilter *srcFilter,

SwsFilter *dstFilter,

const double *param);

  • srcW:输入图像的宽度
  • srcH: 输入图像的宽度
  • srcFormat: 输入图像的像素格式
  • dstW:输出图像的宽度
  • dstH: 输出图像的高度
  • dstFormat:输出图像的像素格式
  • flags 选择缩放算法(只有当输入输出图像大小不同时有效),一般选择SWS_FAST_BILINEAR
  • srcFilter: 输入图像的滤波器信息, 若不需要传NULL
  • dstFilter:输出图像的滤波器信息, 若不需要传NULL
  • param : 特定缩放算法需要的参数(?),默认为NULL
  • 成功后返回SwsContext 类型的结构体。

示例代码:

SwsContext* swsContext = sws_getContext(mAvContext->width,mAvContext->height,mAvContext->pix_fmt,
                                            mAvContext->width,mAvContext->height,AV_PIX_FMT_RGBA,
                                            SWS_BICUBIC,NULL,NULL,NULL);

10.sws_scale()


处理图像数据。

其原型如下:

int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],

const int srcStride[], int srcSliceY, int srcSliceH,

uint8_t *const dst[], const int dstStride[]);

参数:

SwsContext *c: 转换格式的上下文。

srcSlice[],:输入图像的每个颜色通道的数据指针。

srcStride[]:输入图像的每个颜色通道的跨度。.

srcSliceY:起始位置。

srcSliceH:处理多少行。

dst[]:输出图像的每个颜色通道数据指针。

dstStride[]:输出图像的每个颜色通道行字节数。

示例代码:

//转换为rgb格式
                sws_scale(swsContext, (const uint8_t *const *) frame->data, frame->linesize, 0,
                          frame->height, rgb_frame->data,
                          rgb_frame->linesize);
目录
相关文章
|
2月前
|
编解码 算法 C++
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
22 0
|
2月前
|
编解码 测试技术
ffmpeg中的时间单位以及时间转换函数(av_q2d av_rescale_q)
ffmpeg中的时间单位以及时间转换函数(av_q2d av_rescale_q)
43 0
|
5月前
|
API 开发工具 C语言
解决新版本ffmpeg找不到avpriv_io_delete函数等问题
解决新版本ffmpeg找不到avpriv_io_delete函数等问题
32 0
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
733 0