FFmpeg基础知识之视频编码api接口

        视频的编码在实际应用中无处不在,可以这么说,正因为有了编码技术,流媒体才能发展到如今这个地步,毕竟一张1080P的YUV数据高达3MB左右,一秒25帧的视频需要75MB,要是一个小时,一天的视频大小,按照这个大小的话,卖硬盘的厂家要笑开花了。

视频编码

1.codec = avcodec_find_encoder_by_name(codec_name); 通过编解码器的(libx264、h264nvenc)名字查找编解码器
2.c = avcodec_alloc_context3(codec);通过编码器实例申请编码器上下文
3.pkt = av_packet_alloc();申请pkt,用于存储未解码(已编码)的数据
4.ret = avcodec_open2(c, codec, NULL);初始化编码器上下文,并给AVCodecContext上下文数据成员分配存储空间
5.f = fopen(filename, "wb");打开输入文件
6.frame = av_frame_alloc();申请存放未编码数据的AVFrame结构
7.ret = av_frame_get_buffer(frame, 0);分配AVFrame结构内部数据成员的存储区域
8.ret = av_frame_make_writable(frame);确保frame数据是可写的,确保下面的avcodec_send_frame 可以读取frame数据
9.encode(c, frame, pkt, f);编码流程
9.1.ret = avcodec_send_frame(enc_ctx, frame);把未编码的frame数据发送到编码器上下文中去,就可以完成编码的操作
9.2.avcodec_receive_packet(enc_ctx, pkt);从编码器上下文中读取已经编码完成的pkt数据包
9.3.fwrite(pkt->data, 1, pkt->size, outfile);把已经编码的数据写到文件中去
10.encode(c, NULL, pkt, f);同上面第9小点,主要是起一个刷新编码器上下文的作用
11.fwrite(endcode, 1, sizeof(endcode), f);如果是MPEG1和MPEG2,则会在末尾加上uint8_t endcode[] = { 0, 0, 1, 0xb7 };
12.fclose(f);关掉输入文件
13.avcodec_free_context(&c);释放编码器 上下文结构
14.av_frame_free(&frame);释放未编码数据存放的AVFrame结构
15.av_packet_free(&pkt);释放编码数据存放的AVPacket结构

总结

        使用FFmpeg进行视频文件的编码其实是一件非常简单的事情,就是通过avcodec_send_frame接口往里面送数据,然后通过avcodec_receive_packet把已经编码好的数据读取出来,相对应的来说,反而是前面的数据读取以及初始化流程比较的复杂,这就可以说明FFMpeg是多么的完善。

        写这个系列的文档只是为了帮助大家理解ffmpeg中常用的api接口是什么作用,因为我在看雷神博客的时候,发现一些API接口并没有实际的注释,导致笔者在阅读代码的时候实在是看不懂是什么意思,劝退功能实在是强大

        所以才想着写这一简单的系列,帮助大家更好的学习ffmpeg。

你可能感兴趣的:(ffmpeg,ffmpeg,音视频)