编解码所涉及到的函数

1,void av_register_all(void);
注册了和编解码器有关的组件,还注册了复用器,解复用器,协议处理器.
2,int avformat_network_init(void);使用网络
3,int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
Open an input stream and read the header. The codecs are not opened.读取多媒体数据文件头,根据视音频流创建相应的AVStream。

  • 返回值:0-打开成功 <0打开失败
  • 参数
    ps:AVFormatContext fmt_ctx,传入&fmt_ctx.
    filename:const char
    src_filename = "cuc_ieschool.flv"; 传入src_filename
    fmt:可为NULL,也可为AVOutputFormat *ofmt = NULL;传入ofmt
    options:NULL
  • 调用:avformat_open_input(&fmt_ctx, src_filename, NULL, NULL);

4,int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
此函数需要讲解,实在不懂具体做了什么

编解码器相关的函数

5,int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags);
获取音视频对应的stream_index

  • 返回值:成功-流的索引 失败-<0
  • 参数
    ic:AVFormatContext *fmt_ctx,传入fmt_ctx
    type:AVMEDIA_TYPE_VIDEO\AVMEDIA_TYPE_AUDIO
    wanted_stream_nb:可为-1
    related_stream:关联流,可为-1
    decoder_ret:可为NULL
    flags:标志,可为0,不标示
  • 调用:ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);

6,AVCodec *avcodec_find_decoder(enum AVCodecID id);
根据AVCodecContext结构体的codec_id获取编解码器的结构体

  • 返回值:AVCodec
  • 参数:AVCodec结构体的id
  • 调用:AVCodec dec = avcodec_find_decoder((codec_context)->codec_id);

7,int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
打开编解码器

  • 返回值:0-打开成功 <0-打开失败
  • 参数:
    avctx:编解码器上下文,
    AVCodecContext *codec_context = NULL; AVStream *st = fmt_ctx->streams[stream_index]; codec_context = st->codec;根据AVFormatContext获取传入codec_context
    codec:传入codec_context->codec_id
    options:额外配置
  • 调用:AVCodec dec = avcodec_find_decoder((codec_context)->codec_id);

解码相关的函数,AVPacket、AVFrame、SwsContext
8,AVPacket, AVFrame的初始化

  • AVPacket:AVPacket packet; initPakcet(&packet);void initPakcet(AVPacket *packet){ av_init_packet(packet); packet->data = NULL; packet->size = 0; }
    void av_init_packet(AVPacket *pkt);为AVPacket结构体初始化并分配内存,而结构体的变量data和size没有初始化
  • AVFrame AVFrame* yuvFrame = NULL; inityuvframe(&yuvFrame, codec_context); void inityuvframe(AVFrame **yuvFrame, AVCodecContext* codec_context){ *yuvFrame = av_frame_alloc(); uint8_t *out_buffer = (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, dst_w, dst_h)); avpicture_fill((AVPicture *)(*yuvFrame), out_buffer, AV_PIX_FMT_YUV420P, dst_w, dst_h); }
    AVFrame *av_frame_alloc(void);为AVFrame结构体初始化并分配内存,而结构体的变量data没有初始化

9,int av_read_frame(AVFormatContext *s, AVPacket *pkt);
返回流的下一帧。此函数返回存储在文件中的内容,但不验证解码器是否有有效的帧。它将把文件中存储的内容拆分为帧,并为每个调用返回一个帧。它不会忽略有效帧之间的无效数据,从而为解码器提供最大可能的解码信息。

  • 返回值:0 if OK, < 0 on error or end of file
  • 参数:
    s:AVFormatContext *fmt_ctx;传入 fmt_ctx
    pkt:AVPacket packet;传入&packet
  • 调用:if (av_read_frame(format_context, &packet) >= 0)

10,int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt);
没看懂源码的解释

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

  • 参数 输入输出的宽,高,像素格式
    flags:用作宽高变化时的处理方式
  • 调用SwsContext *sws_ctx = sws_getContext( codec_context->width, codec_context->height, codec_context->pix_fmt, dst_w, dst_h, AV_PIX_FMT_YUV420P, SWS_BILINEAR, NULL, NULL, NULL);

12,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[]);

  • 返回值:the height of the output slice
  • 参数:
    c:SwsContext上下文
    srcSlice[]:frame->data(数据的来源)
    srcStride[]:frame->linesize(数据的来源)
    srcSliceY:从第几行开始扫描
    srcSliceH:一共扫描多少行
    dst[]:yuvFrame->data(数据的输出)
    dstStride[]:yuvFrame->linesize(数据的输出)
  • 调用:sws_scale(sws_ctx, frame->data, frame->linesize, 0, frame->height, yuvFrame->data, yuvFrame->linesize);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容