FFmpeg 的常用API
附录:FFmpeg库先容
库先容libavcodec音视频编解码核心库
编码 (avcodec_send_frame, avcodec_receive_packet)。
解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的剖析和封装功能,多种多媒体封装格式(如 MP4、MKV、FLV、TS、AVI 等)。
分配和初始化上下文 (avformat_alloc_context, avformat_alloc_output_context2)。
剖析媒体流 (avformat_open_input)。
写入媒体流 (avformat_write_header, av_write_frame, av_write_trailer)。libavutil提供多种辅助工具。libswscale处置处罚图像的缩放和色彩格式转换。像素格式转换(从 RGB 转换为 YUV420)。图像的尺寸缩放(如调解视频分辨率)。
转换像素格式 (sws_scale)。
分配和初始化上下文 (sws_getContext)。libswresample处置处罚音频的重采样和格式转换
初始化重采样上下文 (swr_alloc_set_opts, swr_init)。
音频格式转换 (swr_convert)。libavdevice处置处罚装备输入输出。
提供多媒体输入装备的支持(如摄像头、麦克风)。libpostproc提供视频后处置处罚功能。
重要用于视频质量加强(如去块效应、降噪处置处罚)。共同视频解码器使用,改善解码后的视频质量。附录1:参考文献
ffmpeg视频编解码流程:https://www.cnblogs.com/fxw1/p/17229792.html
常用API:https://www.cnblogs.com/linuxAndMcu/p/12041359.html
FFmpeg各版本区别:https://juejin.cn/post/7261245655128424509
附录2:编解码流程图
新版本ffmpeg4.0:
老版本ffmpeg3.0:
一、通用API
1.1 av_register_all()
初始化 libavformat 和注册全部的复用器muxer、解复用器demuxer和协议。(ffmpeg4.0已正式废弃)- void av_register_all(void);
复制代码 1.2 avcodec_find_encoder、avcodec_find_decoder
查找具有匹配编解码器ID的已注册编/解码器,位于 libavcodec\avcodec.h- // 函数的参数是一个编码器的ID,返回查找到的编码器(没有找到就返回NULL)。
- AVCodec *avcodec_find_encoder(enum AVCodecID id);
- // 函数的参数是一个解码器的ID,返回查找到的解码器(没有找到就返回NULL)。
- AVCodec *avcodec_find_decoder(enum AVCodecID id);
复制代码 1.3 avcodec_open2()
**初始化一个视音频编解码器的 AVCodecContext以使用给定的AVCodec。**声明位于 libavcodec\utils.c- int avcodec_open2(AVCodecContext *avctx,
- const AVCodec *codec,
- AVDictionary **options);
复制代码
- avctx:须要初始化的 AVCodecContext。
- codec:输入的AVCodec。
- options:一些选项。比方使用libx264编码的时间,“preset”,“tune”等都可以通过该参数设置。
1.4 avcodec_close()
关闭给定的avcodeContext并开释与之关联的全部数据,声明位于 libavcodec\utils.c- int avcodec_close(AVCodecContext *avctx);
复制代码 二、解码相干API
2.1 avformat_open_input()
打开输入流和读取头信息,流必须使用avformat_close_input()关闭- int avformat_open_input(AVFormatContext **ps,
- const char *url,
- AVInputFormat *fmt,
- AVDictionary **options);
复制代码
- ps:用户提供的AVFormatContext(由avformat_alloc_context分配)的指针。
- url:打开的视音频流的 URL。
- fmt:如果!=NULL,则此参数欺压使用特定的输入格式。否则将自动检测格式。
- options:包罗AVFormatContext和demuxer私有选项的字典;一样平常环境下可以设置为 NULL。
2.2 avformat_find_stream_info()
**读取查抄媒体文件的数据包以获取具体的流信息,**如媒体存入的编码格式。- int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
复制代码
- ic:媒体文件的上下文
- options:字典,设置选项
2.3 av_read_frame
读取码流中的音频多少帧大概视频一帧
比方,解码视频的时间,每解码一个视频帧,须要先调用 av_read_frame() 得到一帧视频的压缩数据,然后才华对该数据举行解码。- int av_read_frame(AVFormatContext *s, AVPacket *pkt);
复制代码 2.4 avcodec_send_packet()
新版FFMPEG4.0引入:重要用于将编码或解码的数据包(Packet)送入编解码器的输入队列- int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
复制代码
- avctx:指向 AVCodecContext 结构的指针,包罗与编码器或解码器相干的设置信息。(如avcodec_open2初始化的编解码器)
- avpkt:指向 AVPacket 结构的指针,体现要送入编解码器的输入数据包。(如av_read_frame的数据包)
2.5 avcodec_receive_frame()
新版FFMPEG4.0引入:用于从解码器获取解码后帧- int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
复制代码
- avctx:指向 AVCodecContext 结构的指针,它包罗与解码器相干的上下文和设置信息。你必须在解码器初始化后(通过 avcodec_open2)提供此参数。
- frame:指向 AVFrame 结构的指针,吸取解码后的帧数据。AVFrame 是一个结构体,体现解码后的视频或音频数据。解码后的数据将存储在这个结构中。
为什么要使用 avcodec_send_packet 和 avcodec_receive_frame
- 分离输入和输出:使用这两个函数可以将输入和输出解耦,给解码器提供更大的机动性。比方,在多线程环境中,你可以在一个线程中调用 avcodec_send_packet 发送数据包,而在另一个线程中调用 avcodec_receive_frame 获取解码效果。
- 线程安全:新版的 API 提供了线程安全的机制,尤其实用于异步解码或编码使命。
- 加强性能和机动性:通过渐渐处置处罚数据,制止了直接处置处罚整个解码过程所带来的性能瓶颈。
2.6 avformat_close_input()
对应2.1;关闭打开的流。并开释AVFormatContext的全部内容并将*s设置为空- void avformat_close_input(AVFormatContext **s)
复制代码- ## 三、编码相关API
- ### 3.1 `avformat_alloc_output_context2`
- > 用于**分配并初始化**一个输出媒体格式的上下文 (`AVFormatContext`) (通常是第一个调用的函数)
- ```c++
- int avformat_alloc_output_context2(AVFormatContext **ctx,
- AVOutputFormat *oformat,
- const char *format_name,
- const char *filename);
复制代码
- ctx:指向输出上下文指针的指针,用于存储分配的 AVFormatContext。
- oformat:指定输特别式(AVOutputFormat),可以为 NULL。如果为 NULL,则根据 format_name 或 filename 自动推断格式。
- format_name:指定输特别式的名称(如 "mp4"、"mkv" 等),用于明确输出文件的封装格式。可以为 NULL。
- filename:输出文件的名称。此参数会用于推断格式(如果 oformat 和 format_name 都为 NULL)。
3.2 avformat_write_header()
为输出文件写入文件头,准备文件封装格式所需的元数据。- int avformat_write_header(AVFormatContext *s, AVDictionary **options);
复制代码
- s (AVFormatContext):指向输出上下文 (AVFormatContext) 的指针,必须是用 avformat_alloc_output_context2 创建的,而且已经设置好音视频流 (AVStream)。
- options (AVDictionary**):用于转达格式化选项的字典指针,可以为 NULL。
- 设置编码参数(如比特率 bit_rate)。
- 设置容器格式选项(如 movflags)。
- 须要在调用完成后手动开释(通过 av_dict_free)。
3.3 av_write_frame()
用于将单个媒体包(AVPacket)写入输出文件。它是音视频数据封装的紧张步调,直接处置处罚编解码后的数据帧。- int av_write_frame(AVFormatContext *s, AVPacket *pkt)
复制代码 s (AVFormatContext*)
指向输出上下文的指针,通常由 avformat_alloc_output_context2 创建并初始化。
pkt (AVPacket*)
包罗须要写入的媒体数据的包(AVPacket)。它应该包罗目标流的索引 (stream_index)、解码后的时间戳(PTS/DTS)、以及数据缓冲区。
3.4 av_write_trailer()
用于输出文件尾- int av_write_trailer(AVFormatContext *s)
复制代码 四、图像处置处罚API
4.1 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:输入图像的像素格式(AVPixelFormat 罗列值,比方 AV_PIX_FMT_YUV420P)。
- dstW 和 dstH:输出图像的宽度和高度。dstFormat:输出图像的像素格式(比方 AV_PIX_FMT_RGB24)。
- flags:用于控制缩放的算法。可以是以下值之一或它们的组合:
- SWS_FAST_BILINEAR:快速双线性缩放。
- SWS_BILINEAR:双线性缩放。
- SWS_BICUBIC:双三次插值缩放(质量高)。
- SWS_LANCZOS:Lanczos重采样(质量最高)。
- srcFilter 和 dstFilter:分别为输入和输出图像使用的滤波器。通常为 NULL。
- param:滤波器相干参数,通常为 NULL。
4.2 sws_scale()
libswscale 库中的关键函数,用于在图像转换和缩放过程中实行实际的像素格式转换和尺寸调解使用。它在 sws_getContext 初始化的上下文中完成图像数据处置处罚- 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[]) )
复制代码 c (struct SwsContext):指向由 sws_getContext 返回的上下文结构体,界说了转换和缩放的参数。
srcSlice (const uint8_t *const[]):输入图像的每个平面的指针数组(通常是 AVFrame->data)。
srcStride (const int[]):输入图像每行的字节数数组,对应每个数据平面(通常是 AVFrame->linesize)。
srcSliceY (int):输入图像处置处罚的起始行号,通常为 0。
srcSliceH (int):输入图像处置处罚的行数(高度),比方 AVFrame->height。
dst (uint8_t *const[]):输出图像的每个平面的指针数组,存储转换后的数据。
dstStride (const int[]):输出图像每行的字节数数组,对应每个数据平面。
4.3 sws_freeContext()
开释一个 SwsContext- void sws_freeContext(struct SwsContext *swsContext)
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |