ffmpeg
文章平均质量分 72
ffmpeg相关技术
LceChan
这个作者很懒,什么都没留下…
展开
-
AvFrame和AvPacket
在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。原创 2023-01-18 22:36:36 · 2482 阅读 · 1 评论 -
ffmpeg时间戳相关函数
ffmpeg中与时间戳相关的函数主要有:av_rescale_q,av_rescale_q_rnd,av_compare_ts。= 4);a0 += r;for(i = 63;i >= 0;a1 -= c;t1 ++;1= 4);a0 += r;for(i = 63;i >= 0;原创 2023-01-15 12:38:06 · 1276 阅读 · 0 评论 -
ffmpeg错误总结
chrono(201): error C2510: “_Duration”:“::”的左边必须是类/结构/联合。chrono(201): error C2061: 语法错误: 标识符“rep”在C++项目中,使用FFmpeg中的av_err2str函数时,报错。打开项目属性-> C/C++ -> 预处理器-> 预处理器定义。错误 C3861 “UINT64_C”: 找不到标识符。添加: __STDC_LIMIT_MACROS。“INTMAX_MAX”: 未声明的标识符。UINT64_C”: 找不到标识符。原创 2023-01-14 20:08:25 · 1885 阅读 · 0 评论 -
FFmpeg之av_err2str、av_ts_buff、av_ts2str、av_ts2timestr报错解决方案
【代码】FFmpeg之av_err2str、av_ts_buff、av_ts2str、av_ts2timestr报错解决方案。原创 2023-01-14 20:03:55 · 657 阅读 · 0 评论 -
FFmpeg源码分析: avformat_alloc_output_context2()
从代码中可以看出,av_guess_format()中使用一个整型变量score记录每种输出格式的匹配程度。函数中包含了一个while()循环,该循环利用函数av_oformat_next()遍历FFmpeg中所有的AVOutputFormat,并逐一计算每个输出格式的score。oformat:指定AVFormatContext中的AVOutputFormat,用于确定输出格式。format_name:指定输出格式的名称。av_guess_format()的代码如下所示。filename:文件的名称。原创 2023-01-10 23:21:30 · 601 阅读 · 0 评论 -
FFmpeg源码分析:连接AVFilter的桥梁buffersrc与buffersink
FFmpeg在libavfilter模块提供音视频滤镜,而buffersrc与buffersink是连接AVFilter滤镜的桥梁。其中buffersrc是输入缓冲区,buffersink是输出缓冲区。通过调用av_buffersrc_add_frame_flags(),把待滤波的音视频帧推送到输入缓冲区;调用av_buffersink_get_frame_flags()从输出缓冲区取出滤波后的音视频帧。原创 2022-11-05 10:01:36 · 1111 阅读 · 0 评论 -
FFmpeg源码分析:AVFilterGraph与AVFilter
FFmpeg在libavfilter模块提供简单与复杂的音视频滤镜,所有滤波器由AVFilterGraph滤波器图表连接起来。简单滤镜为一对一输出,复杂滤镜为多对一输出。重要的结构体包括:AVFilterGraph、AVFilterLink、AVFilterContext、AVFilter。支持在滤波器图表指定位置插入AVFilter滤波器,然后由AVFilterLink把滤波器连接起来。原创 2022-11-05 09:32:12 · 947 阅读 · 0 评论 -
FFmpeg源码分析:写媒体文件尾av_write_trailer()
其中muxer封装文件包括avformat_write_header()、av_write_frame()和av_write_trailer()。同样地,以mp4封装格式为例。结合前面的文章:avformat_write_header()写媒体文件头和av_write_frame()写媒体数据包,可以完整地实现muxer封装器。第1步的write_packets_from_bsfs和第2步的interleaved_write_packet在av_write_frame()文章有介绍。原创 2022-10-24 22:14:25 · 858 阅读 · 0 评论 -
FFmpeg源码分析:写音视频帧av_write_frame()
FFmpeg在libavformat模块提供音视频的muxer封装与demuxer解封装。其中muxer封装文件包括avformat_write_header()、av_write_frame()和av_write_trailer()。本文主要探讨av_write_frame函数如何写入音视频帧数据,包括音视频交错与音视频非交错两种情况。原创 2022-09-20 00:31:54 · 1104 阅读 · 0 评论 -
FFmpeg源码分析:写媒体文件头avformat_write_header()
封装文件格式的主要API包括:avformat_write_header()写文件头,av_write_frame() / av_interleaved_write_frame()写音视频帧,av_write_trailer()写文件尾。任何封装器的私有选项必须通过选项参数传递到这个函数。FFmpeg在libavformat模块提供mux封装视频的API,包括avformat_write_header()写文件头、av_write_frame()写音视频帧、av_write_trailer()写文件尾。原创 2022-10-24 21:48:07 · 1754 阅读 · 0 评论 -
ffmpeg time_base
ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。原创 2022-10-15 14:36:58 · 1216 阅读 · 0 评论 -
FFmpeg时间戳详解
例如,如果一个视频帧的dts是40,pts是160,其time_base是1/1000秒,那么可以计算出此视频帧的解码时刻是40毫秒(40/1000),显示时刻是160毫秒(160/1000)。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。根据注释中的建议,实际使用时,在视频解码过程中,我们不使用AVCodecContext.time_base,而用帧率倒数作时间基,在视频编码过程中,我们将AVCodecContext.time_base设置为帧率的倒数。转载 2022-10-15 12:08:41 · 2284 阅读 · 0 评论 -
理解ffmpeg中的pts,dts,time_base
非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVCodecContext 的time_base ,AVRational{1,25}。压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVStream的time_base,AVRational{1,90000}。如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。如果你是把1秒分成90000份,每一个刻度就是1/90000秒,此时的time_base={1,90000}。原创 2022-10-14 00:04:59 · 528 阅读 · 0 评论 -
FFmpeg源码分析:av_parser_parse2()解析数据包
在FFmpeg的libavcodec模块提供解析数据包和编解码功能。其中,av_parser_parse2()函数用来解析数据包,在使用av_read_frame()读取音视频帧时,会调用到该函数进行数据包解析。文章。原创 2022-10-10 00:26:46 · 698 阅读 · 0 评论 -
FFmpeg源码分析:内存管理系统
FFmpeg有专门的内存管理系统,包括:内存分配、内存拷贝、内存释放。其中内存分配包含分配内存与对齐、内存分配与清零、分配指定大小的内存块、重新分配内存块、快速分配内存、分配指定最大值的内存、分配数组内存、快速分配数组内存、重新分配数组内存。原创 2022-10-09 23:26:50 · 523 阅读 · 0 评论 -
FFmpeg源码分析:resample重采样
FFmpeg在libswresample模块提供重采样函数。音频重采样过程是先建立原始音频信号,然后重新采样。重采样分为上采样和下采样,其中上采样需要插值,下采样需要抽取。从高采样率到低采样率转换是一种有损过程,FFmpeg提供若干选项和算法进行重采样。原创 2022-09-30 00:00:43 · 615 阅读 · 0 评论 -
FFmpeg源码分析:图像常用操作
FFmpeg有封装图像的常用操作,位于libavutil/imgutils.c,包括图像拷贝、图像填充、获取图像大小、分配图像、检测图像宽高比是否有效。在视频图像缩放、像素格式转换、视频截图保存等操作,经常需要用到图像操作方法。原创 2022-09-25 00:37:16 · 1646 阅读 · 0 评论 -
FFmpeg源码分析:sws_scale图像缩放与图像转换
FFmpeg在libswscale模块提供图像缩放与图像转换功能,比如1080P图像缩放为720P,或者YUV422P转换为YUV420P。图像缩放函数有个SwsContext结构体作为上下文,上一篇文章有介绍:SwsContext图像转换上下文。原创 2022-09-24 15:17:07 · 1839 阅读 · 0 评论 -
FFmpeg源码分析:SwsContext图像转换上下文
FFmpeg的libswscale模块提供图像缩放、图像格式转换功能。其中贯穿整个模块的是SwsContext结构体,方法包括sws_alloc_context分配、sws_init_context初始化、sws_getContext获取上下文、sws_get_cachedContext获取缓存,sws_freeContext释放上下文的方法。原创 2022-09-24 15:03:38 · 470 阅读 · 0 评论 -
FFmpeg源码分析:avcodec_send_packet()与avcodec_receive_frame()音视频解码
FFmpeg在libavcodec模块,旧版本提供avcodec_decode_video2()作为视频解码函数,avcodec_decode_audio4()作为音频解码函数。在FFmpeg 3.1版本新增avcodec_send_packet()与avcodec_receive_frame()作为音视频解码函数。后来,在3.4版本把avcodec_decode_video2()和avcodec_decode_audio4()标记为过时API。原创 2022-09-03 00:51:25 · 1995 阅读 · 1 评论 -
FFmpeg源码分析:avcodec_send_frame()和avcodec_receive_packet()音视频编码
FFmpeg在libavcodec模块,旧版本提供avcodec_encode_video2()作为视频编码函数,avcodec_encode_audio2()作为音频编码函数。在FFmpeg 3.1版本新增avcodec_send_frame()与avcodec_receive_packet()作为音视频编码函数。后来,在3.4版本把avcodec_encode_video2()和avcodec_encode_audio2()标记为过时API。原创 2022-09-19 23:41:32 · 3760 阅读 · 0 评论 -
FFmpeg源码分析:avcodec_open()打开编解码器
FFmpeg在libavcodec模块提供编解码能力,使用流程:寻找编解码器、分配编解码器上下文、打开编解码器、编码成AVPacket/解码成AVFrame、关闭编解码器。本文以avcodec_open()打开编解码器为主,对编解码整体流程进行分析。原创 2022-09-24 12:09:17 · 774 阅读 · 0 评论 -
FFmpeg源码分析:av_read_frame()读取音视频帧
FFmpeg使用av_read_frame()方法读取音频流、视频流、字幕流,得到AVPacket数据包。FFmpeg官方提供的samples有使用示例,或者在ffplay.c代码中:打开文件/网络流后,while循环调用av_read_frame()读取帧数据,也就是解封装demux过程,直到文件末尾EOF。原创 2022-09-20 00:25:13 · 1399 阅读 · 0 评论 -
FFmpeg源码分析:avcodec_find_decoder()查找解码器
FFmpeg提供两种方式查找解码器,通过codecId查找avcodec_find_decoder()与通过名字查找avcodec_find_decoder_by_name()。同样地,也提供两种方式查找编码器,通过codecId查找avcodec_find_encoder()与通过名字查找avcodec_find_encoder_by_name()。源码位于libavcodec/allcodecs.c中。原创 2022-09-24 10:44:47 · 2813 阅读 · 0 评论 -
ffmpeg中av_find_best_stream()函数的使用
av_find_best_stream()函数就是要获取音视频对应的stream_index。其实,还有另外一种方法来获得音视频对应的stream_index。原创 2022-09-24 10:18:08 · 1370 阅读 · 1 评论 -
FFmpeg源码分析:av_dump_format()
最后一个参数 is_output 选择指定的上下文是输入(0)还是输出(1),也就说最后一个参数填0,打印输入流;最后一个参数填1,打印输出流。FFmpeg API : av_dump_format, 打印关于输入或输出格式的详细信息, 代码声明如下。打印关于输入或输出格式的详细信息,例如持续时间,比特率,流,容器,程序,元数据,边数据,编解码器和时基。原创 2022-09-23 01:15:08 · 483 阅读 · 0 评论 -
FFmpeg源码分析:avformat_find_stream_info分析码流信息
FFmpeg在调用avformat_open_input()之后,可能码流信息不够完整,可以使用avformat_find_stream_info()获取更多的码流信息。比如获取视频帧率、视频宽高,重新计算最大分析时长,打开解码器解码获取codec数据。原创 2022-09-23 00:55:49 · 692 阅读 · 0 评论 -
FFmpeg源码分析:avformat_open_input()打开媒体流
avformat_open_input()用于打开输入媒体流与读取头部信息,包括本地文件、网络流、自定义缓冲区。关键流程:打开avio、探测输入流的封装格式。对应的释放方法为avformat_close_input()。原创 2022-09-25 00:08:41 · 1766 阅读 · 0 评论 -
FFmpeg结构体分析:AVFormatContext连接FFmpeg的桥梁
AVFormatContext对开发者开放,是连接开发者与FFmpeg内部的桥梁。结构体内部包含有AVInputFormat、AVOutputFormat、AVCodec、AVStream、AVDictionary 、AVClass等。支持设置自定义IO、监听网络中断状态、设置options、直播秒开调优等。在使用FFmpeg拉流直播时,做直播秒开调优,可以调节probesize和max_analyze_duration。原创 2022-09-19 23:24:00 · 603 阅读 · 0 评论 -
FFmpeg源码分析: AVStream码流
在seek操作时,根据给定时间戳二分查找timestamp数组,seek有三种模式:previous、next、nearest,一般使用previous前向查找。其中,索引数组用于保存每帧数据包offset、size、timestamp、flag,用于seek定位某个时间戳对应的帧。然后是AVCodecContext的编解码器参数,包括codec_type(媒体类型)、codec_id、bit_rate、profile、level、width、height、sample_rate、channels等。转载 2022-09-29 23:32:15 · 448 阅读 · 1 评论 -
FFmpeg结构体分析: AVCodecContext编解码器上下文
AVCodecContext是FFmpeg编解码上下文的结构体,而AVCodec是编解码参数的结构体。AVCodecContex内部有包含AVCodec、AVCodecInternal、AVRational等结构体,包含AVCodecID、AVMediaType、AVPixelFormat、AVSampleForat等枚举类型,包含视频的width、height、framerate、bitrate等关键参数,包含音频的samplerate、channels等参数。转载 2022-09-29 23:54:51 · 2571 阅读 · 0 评论 -
FFmpeg源码分析: AVFrame与AVPacket
AVFrame结构体位于frame.h头文件,用于存储解码后的音视频帧数据,使用av_frame_alloc进行分配,使用av_frame_free进行释放,AVFrame分配一次,多次复用,使用av_frame_unref可以去引用。AVFrame是解码后用于存储音视频帧,包括:data数组、width、height、pts、pkt_dts、pkt_size、pkt_duration、pkt_pos等信息,我们在判断是否为关键帧时,用key_frame参数进行判断。原创 2022-09-03 00:32:34 · 648 阅读 · 0 评论 -
AVPacket
AVPacket是FFmpeg中很重要的一个数据结构,它保存了解复用之后,解码之前的数据(仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts)、解码时间戳(dts)、数据时长,所在媒体流的索引等。对于视频来说,AVPacket通常包含一个压缩的Frame,而音频(Audio)则有可能包含多个压缩的Frame。并且,一个Packet有可能是空的,不包含任何压缩数据,只含有side data(side data,容器提供的关于Packet的一些附加信息。...原创 2022-08-26 23:39:16 · 930 阅读 · 0 评论 -
ffmpeg中的时间
一、首先FFmpeg中存在多个时间基(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。1、AVstream中(libavformat/avformat.h)关于codec, 在libavcodec/avcode.h中定义了codec的ID可以看出这里的time_base单位为秒。.........原创 2022-08-11 22:45:39 · 863 阅读 · 0 评论 -
yuv裁剪
无论是BGR24、RGB24;都是以3个byte为一个整体进行裁剪;因此以下代码兼容24bpp的RGB数据的裁剪。4.裁剪BGR24。原创 2022-07-26 22:22:24 · 651 阅读 · 1 评论 -
彻底弄懂I420格式
虽然主要是讲解的如果处理I420格式,但是前面介绍了几种不同YUV的存储格式。可以结合存储示意图,类推出如何处理其它YUV格式数据。httpshttpshttpshttpshttpshttps。转载 2022-07-16 11:15:43 · 2931 阅读 · 0 评论 -
封装视频的步骤
解封装是直接调用函数就生成了一个上下文,但是封装却需要创建一个上下文。因为有这样一个区别,在解封装过程中,上下文中有很多信息是由的接口填入的,但是如果是封装的话,很多信息需要我们自己填入(毕竟不知道你最终想要生成的视频的具体参数是什么)。提供了一个函数用于创建此上下文,当上下文创建完毕之后,我们需要自行设定上下文参数。二. 添加音频视频流2.1 概述在上下文中插入音频或视频流信息。在的数组中插入音频或视频流信息。注意:new stream是有次序的,可以看到上述接口并没有需要传入索引号,原创 2022-07-04 23:52:29 · 1423 阅读 · 0 评论 -
音视频同步(播放)原理
每一帧音频或视频都有一个持续时间:duration:采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内转载 2022-07-03 18:01:46 · 865 阅读 · 1 评论 -
ffmpeg数据结构AVBuffer,AVFrame,AVPacket
AVBufferAVBuffer是FFmpeg中很常用的一种缓冲区,缓冲区使用引用计数(reference-counted)机制。AVBufferRef则对AVBuffer缓冲区提供了一层封装,最主要的是作引用计数处理,实现了一种安全机制。用户不应直接访问AVBuffer,应通过AVBufferRef来访问AVBuffer,以保证安全。 data: 缓冲区地址 size: 缓冲区大小 refcount: 引用计数值 free: 用于释放缓冲区内存的回调函数 opaque: 提供给free原创 2022-07-03 14:16:49 · 1280 阅读 · 0 评论 -
FFMPEG常用的一些命令介绍:音频录制、视频录制
1.视频和音频单独抓取如果指定输入格式和设备,则ffmpeg可以直接捕获视频和音频。Linux下捕获摄像头的数据保存成视频文件:参数介绍:-s 指定摄像头输出的图像尺寸-i 摄像头的设备节点test.mp4 是保存的视频文件名称-f video4linux2是指定框架2. Linux下捕获声卡的数据保存成音频文件:列出当前主机上的声卡设备:使用arecord -L命令列出了声卡名字之后,就可以选择指定声卡录制声音,其中front:xxx 就是声卡的名字。选择指定的声卡录制声音示例:原创 2022-06-29 00:14:47 · 4833 阅读 · 0 评论