常用方法

void av_register_all()

简要描述
  • 初始化所有组件,只有调用了该函数,才能使用复用器和编解码器

void avfilter_register_all()

简要描述
  • 注册滤波器

void avformat_network_init()

简要描述
  • 加载socket库以及网络加密协议相关的库,为后续使用网络相关提供支持

AVFormatContext *avformat_alloc_context()

简要描述
  • AVFormatContext *avformat_alloc_context(void)函数用来申请AVFormatContext类型变量并初始化默认参数。申请的空间
返回示例
    AVFormatContext* pCtx;
    pCtx = avformat_alloc_context();

int avformat_open_input(AVFormatContext ps, const char url, ff_const59 AVInputFormat fmt, AVDictionary options)

简要描述
  • 打开一个输入流并读取头文件。编解码器没有打开。流必须用avformat_close_input()关闭。
参数 类型 说明
ps AVFormatContext** 格式化的上下文。要注意,如果传入的是一个AVFormatContext*的指针,则该空间须自己手动清理,若传入的指针为空,则FFmpeg会内部自己创建
url const char * 传入的地址。支持http,RTSP,以及普通的本地文件。地址最终会存入到AVFormatContext结构体当中
fmt ff_const59 AVInputFormat * 指定输入的封装格式。一般传NULL,由FFmpeg自行探测
options AVDictionary ** 其它参数设置。它是一个字典,用于参数传递,不传则写NULL
返回示例
    AVFormatContext* pCtx;
    pCtx = avformat_alloc_context();
    ret = avformat_open_input(&pCtx, url.c_str(), 0, 0);//执行成功返回0,否则<0

void avformat_close_input(AVFormatContext **s)

简要描述
  • 关闭一个打开的输入AVFormatContext。释放它和它的所有内容,并将*s设置为NULL
参数 类型 说明
s AVFormatContext** 要关闭的一个格式化的上下文
使用方法
    AVFormatContext* pCtx;
    pCtx = avformat_alloc_context();
    ret = avformat_open_input(&pCtx, url.c_str(), 0, 0);//执行成功返回0,否则<0
    ...
    avformat_close_input(&pCtx);

int avformat_find_stream_info(AVFormatContext ic, AVDictionary *options)

简要描述
  • 读取媒体文件的数据包以获取流信息
参数 类型 说明
ic AVFormatContext* 媒体文件句柄
options AVDictionary** 其它参数设置。它是一个字典,用于参数传递,不传则写NULL
使用方法
    int ret;
    AVFormatContext* pCtx;
    pCtx = avformat_alloc_context();
    ret = avformat_open_input(&pCtx, url.c_str(), 0, 0);
    if (ret < 0)
    {
        std::cout << "could not open this url!" << std::endl;
        goto end;
    }

    ret = avformat_find_stream_info(pCtx, 0);
    if (ret < 0)
    {
        std::cout << "failed to get this stream information!" << std::endl;
        goto end;
    }

void av_dump_format(AVFormatContext ic, int index, const char url, int is_output)

简要描述
  • 打印关于输入或输出格式的详细信息,例如持续时间,比特率,流,容器,程序,元数据,边数据,编解码器和时基
参数 类型 说明
ic AVFormatContext* 媒体文件句柄
index int 要转储信息的流的索引
url char* 要打印的URL,例如源文件或目标文件
is_output 最后一个参数填0,打印输入流;最后一个参数填1,打印输出流
使用方法
    av_dump_format(pCtx, 0, url.c_str(), 0);

ff_const59 AVOutputFormat av_guess_format(const char short_name, const char filename, const char mime_type)

简要描述
  • 返回与所提供参数最匹配的已注册输出格式列表中的输出格式,如果不匹配则返回NULL。
参数 类型 说明
short_name const char* if non-NULL检查short_name是否与注册格式的名称匹配
filename const char* if non-NULL检查filename是否与注册格式的名称匹配
mime_type const char * if non-NULL检查mime_type是否与注册格式的MIME类型匹配
使用方法
    AVFormatContext* fctx = NULL;
    fctx = avformat_alloc_context();
    AVOutputFormat* pOutfmt = av_guess_format(NULL, filename.c_str(), NULL);
    fctx->oformat = pOutfmt;

int avio_open2(AVIOContext s, const char url, int flags, const AVIOInterruptCB int_cb, AVDictionary options)

简要描述
  • 创建并初始化一个AVIOContext来访问由url指示的资源。当url指定的资源以读写模式打开时,AVIOContext只能用于写。
参数 类型 说明
s AVIOContext** 用于返回指向创建的AVIOContext的指针。在失败的情况下,指向的值被设置为NULL
url const char* 地址
flags int 控制如何打开由url指示的资源的标志
int_cb const AVIOInterruptCB* 在协议级使用的中断回调
options AVDictionary** 其它参数设置。它是一个字典,用于参数传递,不传则写NULL
使用方法
    int ret;
    AVStream* stream = NULL;
    AVFormatContext* fctx = NULL;

    fctx = avformat_alloc_context();
    AVOutputFormat* pOutfmt = av_guess_format(NULL, filename.c_str(), NULL);
    fctx->oformat = pOutfmt;

    ret = avio_open2(&fctx->pb, filename.c_str(), AVIO_FLAG_READ_WRITE, NULL, NULL);

AVStream avformat_new_stream(AVFormatContext s, const AVCodec *c)

简要描述
  • 在 AVFormatContext 中创建 Stream 通道。
参数 类型 说明
s AVFormatContext* 媒体文件句柄
url const AVCodec* 如果非null,与新流对应的AVCodecContext将被初始化以使用这个编解码器。例如,设置特定于编解码器的默认值时需要这样做,所以如果已知的话,应该提供编解码器
使用方法
    AVStream* stream = avformat_new_stream(fctx, NULL);

AVCodec *avcodec_find_decoder(enum AVCodecID id)

简要描述
  • 查找具有指定名称的已注册解码器。
参数 类型 说明
id enum AVCodecID 请求的解码器的AVCodecID
使用方法
    AVCodecContext *pCodecCtx = pFormatCtx->streams[streamIdx]->codec;
    AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

AVCodec *avcodec_find_encoder(enum AVCodecID id)

简要描述
  • 查找具有指定名称的已注册编码器。
参数 类型 说明
id enum AVCodecID 请求的编码器的AVCodecID
使用方法
    AVCodecContext* pCodecCtx = NULL;
    pCodecCtx = pAudioStream->codec;
    pCodecCtx->codec = pFormatCtx->audio_codec;
    pCodecCtx->codec_id = pFormatCtx->oformat->audio_codec;
    pCodecCtx->codec_type = type;

    pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16;
    pCodecCtx->sample_rate = pInfctx->streams[0]->codec->sample_rate;
    pCodecCtx->channel_layout = AV_CH_LAYOUT_MONO;
    pCodecCtx->channels = av_get_channel_layout_nb_channels(pCodecCtx->channel_layout);
    pCodecCtx->bit_rate = pCodecCtx->channels * pCodecCtx->sample_rate * 16 / 8; //channels* sample_per_sec* bits_per_sample / 8;//64000

    AVCodec* pCodec = avcodec_find_encoder(pCodecCtx->codec_id);

int avcodec_open2(AVCodecContext avctx, const AVCodec codec, AVDictionary **options)

简要描述
  • 打开已注册的解码器。
参数 类型 说明
avctx AVCodecContext* 解码器上下文
codec const AVCodec* 解码器
options AVDictionary** 其它参数设置。它是一个字典,用于参数传递,不传则写NULL
使用方法
    if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)//成功执行返回0,否则<0
    {
        printf("avcode open failed!\n");
        exit(-2);
    }