FFmpeg从入门到入魔(1):初探FFmpeg框架

FFmpeg入门FFmpeg框架 FFmpeg(Fast forword mpeg,音视频转换器)是一个开源免费跨平台的视频和音频流方案,它提供了录制/音视频编解码、转换以及流化音视频的完整解决方案。ffmpeg4.0.2源码目录结构如下:目录说明:FFmpeg|—compat 该目录存放的是兼容文件,以便兼容早期版本 |—doc 说明文档 |—ffbuild |—libavcodec音视频编解码核心库 |—各种设备的输入输出,比如Video4Linux2, VfW, DShow以及 ALSA |—滤镜特效处理 |— 阅读详情

1. FFmpeg介绍与裁剪

1.1 命令行工具

 FFmpeg框架中还提供了几个用于执行命令行完成音视频数据处理工具,包括ffplay、ffprobe、ffserver,具体解释如下:

  • ffplay Fast forword play,用ffmpeg实现的播放器

  • ffserver Fast forword server,用ffmpeg实现的rtsp服务器

  • ffprobe Fat forword probe,用来输入分析输入流

2. FFmpeg架构分析

 在1.1小节中,我们对FFmpeg整体架构进行了简单介绍,阐述了框架中各个模块的功能。本节将在此基础上,重点阐述在利用FFmpeg进行音视频开发中牵涉到的重要步骤,数据结构体以及相关函数。

2.1 FFmpeg处理要点

 总体来说,FFmpeg框架主要的作用在于对多媒体数据进行解协议、解封装、解码以及转码等操作,为了对FFmpeg在视音频中的应用有个更直观理解,下面给出解析rtsp网络流的流程图,该图演示了从打开rtsp流,到最终提取出解码数据或转码的大概过程,如下所示:

术语解释:

  • muxer:视音频复用器(封装器),即将视频文件、音频文件和字幕文件(如果有的话)合并为某一个视频格式,比如讲a.avi、a.mp3、a.srt合并为mkv格式的视频文件;
  • demuxer:视音频分离器(解封装器),即muxer的逆过程;
  • transcode:转码,即将视音频数据从某一种格式转换成另一种格式;
  • RTP包:Real-time Transport Protocol,实时传输协议,是一种基于UDP的网络传输协议,它介于应用层和传输层之间,负责对流媒体数据进行封包并实现媒体流的实时传输;
  • ES流:Elementary Streams,即原始流,也称视/音频裸流,是直接从编码器输出的数据流,可为视频数据流(如H.264、MJPEG等)或音频数据流(如AAC等);
  • PES流:Packetized Elementary Streams,分组ES流,PES流是ES流经过PES打包器将ES分组、打包、加入包头信息等处理后形成的数据流,是用来传递ES的一种数据结构。
  • 解协议:取出网络数据流无关报文信息,以获取真正的视音频数据,常见的协议有rtsp、rtmp、http和mms等;
  • 解封装:即demuxer,封装格式可以为.mp4/.avi/.flv/.mkv等;
  • 解码:将编码数据还原成原始内容,比如将H.264解码为YUV、AAC解码为PCM等;

【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNxicon-default.png?t=M85Bhttps://docs.qq.com/doc/DYU5ORlBOdkpCUkNx


 

2.1 FFmpeg重要的结构体

 FFmpeg中有很多比较重要的结构体,比如与输入输出(I/O)有关的结构体AVIOContext、URLContext、URLProtocol ,与封装格式有关的结构体AVFormatContext、AVInputFormat、AVOutputFormat,与编解码有关的结构体AVCodec、AVCodecContext,以及与音视频数据有关的结构体AVStream、AVPacket、AVFrame等等。刚开始接触FFmpeg时,个人感觉一时间要理解区分这些结构体还是有点困难的,好在这些结构体当中有个“老大哥”-AVFormatContext,AVFormatContext可以说是贯穿整个FFmpeg开发,"犹如神一般的存在"。下面我们就在分析AVFormatContext结构体的基础上,阐述上述结构体的作用与区别。

AVFormatContext

 AVFormatContext结构体描述了一个多媒体文件或流的构成和基本信息,是FFmpeg中最为基本的一个结构体,也是其他所有结构的根。其中,成员变量iformat和oformat为指向对应的demuxing(解封装)和muxing(封装)指针,变量类型分别为AVInputFormat、AVOutputFormat;pb为指向控制底层数据读写的指针,变量类型为AVIOContext;nb_streams表示多媒体文件或多媒体流中数据流的个数;streams为指向所有流存储的二级指针,变量类型AVStream;video_codec和audio_codec分别表示视频和音频编解码器,变量类型为AVCodec等等。AVFormatContext结构体(位于libavformat/avformat.h中)部分源码如下:

typedef struct AVFormatContext {
    const AVClass *av_class;
	// 输入容器格式
	// 只在调用avformat_open_input()时被设置,且仅限Demuxing
    struct AVInputFormat *iformat;
	// 输出容器格式
	// 只在调用avformat_alloc_output_context2()函数时被设置,且仅限封装(Muxing)
    struct AVOutputFormat *oformat;

    /**
     * Format private data. This is an AVOptions-enabled struct
     * if and only if iformat/oformat.priv_class is not NULL.
     *
     * - muxing: set by avformat_write_header()
     * - demuxing: set by avformat_open_input()
     */
    void *priv_data;
	// 输/入输出(I/O)的缓存
	// 说明:解封装(demuxing):值由avformat_open_input()设置
	// 		 封装(muxing):  值由avio_open2设置,需在avformat_write_header()之前
    AVIOContext *pb;
	// stream info
    int ctx_flags;
	// AVFormatContext.streams中数据流的个数
	// 说明:值由avformat_new_stream()设置
    unsigned int nb_streams;
	// 文件中所有流stream列表。创建一个新stream,调用avformat_new_stream()函数实现
	// 当调用avformat_free_context()后,streams所占资源被释放
	// 说明:解封装(demuxing):当调用avformat_open_input()时,streams值被填充
	//   	 封装(muxing):streams在调用avformat_write_header()之前被用户创建
	// 
    AVStream **streams;
	// 输入或输出文件名,如输入:rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov
	// 说明:demuxing:当调用avformat_open_input()后被设置
	//		 muxing: 当调用avformat_alloc_output_context2()后被设置,且需要调用avformat_write_header()之前
    char filename[1024];
	// component的第一帧位置,仅限Demuxing时由libavformat设置
    int64_t start_time;
	// stream的时长,仅限Demuxing时由libavformat设置
    int64_t duration;
	// 总比特率(bit/s),包括音频、音频
    int64_t bit_rate;

	...

	// 视频编解码器ID
	// 说明:Demuxing时由用户设置
    enum AVCodecID video_codec_id;

	// 音频编解码器ID
	// 说明:Demuxing时由用户设置
    enum AVCode
FFmpeg——开源的开源的跨平台音视频处理框架简介 FFmpeg项目的代码托管在GitHub上,地址为 https://github.com/FFmpeg/FFmpeg。在该页面中,您可以找到FFmpeg的最新版本、历史版本和分支,以及源代码的详细文档和示例。该页面还包含了贡献者名单和相关社区信息,可以帮助用户加入开发社区并参与贡献。除了GitHub,FFmpeg的官网也提供了下载和源代码的文档和示例。官网地址为:https://ffmpeg.org/。在官网中,您可以找到FFmpeg最新版本的下载文件和相关文档、示例和库文件。 阅读详情

相关推荐

1 FFmpeg入门到精通-FFmpeg简介

1.FFmpeg简介 1.1 FFmpeg的定义 1.2 FFmpeg的历史 1.3 FFmpeg的基本组成 1.4 FFmpeg的编解码工具ffmpeg 1.5 FFmpeg的播放器ffplay 1.6 FFmpeg的多媒体分析器ffprobe 1.7 FFmpeg编译(1FFmpeg之Windows平台编译(2)FFmpeg之Linux平台编译(3)FFmpeg之OS X平台编译 1.8 FFmpeg编码支持与定制(1FFmpeg的编码器支持(2)FFmpe

migu123的专栏 3607

码率、帧率,what mean?

以前没有接触视频这一块,对视频这一方面的知识不是很了解。现在了解一下码率和帧率的问题。       码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr

menuconfig的专栏 1757

FFmpeg入门入魔(2):保存流到本地MP4

类型的数组以及数组的元素个数,其中,JNINativeMethod类型数组存储的是Java层方法与native层函数的映射信息,该类型是一种结构体,包含三个成员变量,即Java层native方法、native方法签名、映射函数。中创建一个子线程来处理具体的业务,需要注意的是,考虑到在Java语言中对象作为参数在函数中传递总是传递的是对象实体而不是对象引用,因此,假如我们传入到nativeStart方法的。因此,我们需要对其在底层进行缓存再使用,当然,对于开辟的新内存注意合适的时候进行释放操作。

irainsa的博客 4802

FFmpeg简介

一、FFmpeg的定义 FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。 二、FFmpeg的基本组成 FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、A

贝勒里恩的博客 9208

FFmpeg入门实践系列七(滤镜)

1)过滤器的作用是在音视频数据流经FFmpeg时对其进行处理。视频分辨率转换音频混音视频特效(如模糊、锐化)图像格式转换时间基线校正(2)过滤器类型视频过滤器:如crop(裁剪)、scale(缩放)、vflip(垂直翻转)、hue(色相调整)等。音频过滤器:如volume(音量调整)、equalizer(均衡器)、aresample(重采样)等。图形和字幕过滤器:如drawtext(绘制文本)、overlay(图像叠加)等。格式转换过滤器:如format。

weixin_61503529的博客 1933

FFmpeg初探——基于FFmpeg的图片合成视频

前言商家在发布商品的时候,大部分情况下是没有视频的,这样往往会造成商品展示不全等问题,而视频制作又比较麻烦,为了解决此痛点,我们需要提供一键合成视频的功能。之所以选择 FFmpeg,是因为...

大转转FE 9844

Android直播开发之旅(12)初探FFmpeg开源框架

1. FFmpeg介绍与裁剪 1.1FFmpeg简介  FFmpeg(Fast forword mpeg,音视频转换器)是一个开源免费跨平台的视频和音频流方案,它提供了录制/音视频编解码、转换以及流化音视频的完整解决方案。ffmpeg4.0.2源码目录结构如下: 目录说明: FFmpeg  |—compat     该目录存放的是兼容文件,以便兼容早期版本  |—doc      说明文档  ...

老蒋也疯狂 4340

FFmpeg框架系列:获取视频时长

业务场景 业务需求:对上传的视频显示该时长。 FFmpeg框架处理视频信息 FFmpeg官网:http://ffmpeg.org/ 实现思路 在window中安装FFmpeg后,在cmd执行获取时长的命令即可: F:\ffmpegDemo\ffmpeg\bin\ffmpeg.exe -i F://ffmpegDemo//test.mp4 PS:解压在windows本地的ffmpeg程序F:\ffmpegDemo\ffmpeg\bin\ffmpeg.exe以及存放在windows本地视频:F://ffmpe

u010312671的专栏 5061

6 FFmpeg入门到精通-FFmpeg滤镜使用

6.FFmpeg滤镜使用 6.1 FFmpeg滤镜Filter描述格式 6.1.1 FFmpeg滤镜Filter的参数排列方式 6.1.2 FFmpeg滤镜Filter时间内置变量 6.2 FFmpeg为视频加水印 6.2.1 文字水印 6.2.2 图片水印 6.3 FFmpeg生成画中画 6.4 FFmpeg视频多宫格处理 6.5 FFmpeg音频流滤镜操作 6.5.1 双声道合并单声道 6.5.2 双声道提取 6.5.3 双声道转双音频流

migu123的专栏 3140

ffmpeg 入门笔记

那天需要将一段视频文件转成 gif,偶遇 ffmpeg,于是就学习了一下,它真的很强大。在看资料的过程中也是挺有趣的,发现其实 kmplayer 以及国内的 QQ 影音,暴风等等,都不同程度的使用了 ffmpeg,可是根据 ffmpeg 的开源许可 LGPL,任何使用 ffmpeg 的软件都必须开源,于是乎 QQ 影音,暴风都上了 ffmpeg 的耻辱柱,如果没接触到 ffmpeg 还真不知道有这...

r_m_AA的博客 2429

FFmpeg入门及编译

本文主要讲解 FFmpeg 相关知识,以及在 Windows 下编译 FFmpeg 源码以及使用。ffmpeg 是广泛使用的多媒体解决方案,既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。其包括了目前领先的音/视频编码库 libavcodec。ffmpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码,多种协议的流媒体,多种色彩格式转换,多种采样率转换,多种码率转换等。ffmpeg 发展至今,已经被许多开源项目使用。

明天你好的博客 8626

FFmpeg入门入魔(5):浅析滤镜(filter)原理

AVFilter:表示一个滤镜器(Filter),位于../libavfilter/avfilter.h。该结构体用于定义一个滤镜,包含滤镜的名称、// 滤镜器名称,非空且唯一// 滤镜器描述信息,可为NULL// 前缀为AVFILTER_FLAG_*的标志int flags;:表示一个滤镜器(Filter)的实例(instance),位于../libavfilter/avfilter.h。// 该实例对应的滤镜器(Filter)

irainsa的博客 1725

FFmpeg入门入魔(4):OpenSL ES播放PCM音频

虽然OpenSL ES是基于C语言开发,但是它的实现思想是基于面向对象的,与FFmpeg框架提供一系列的函数接口不同,OpenSL ES是以Interface的方式来提供API,即除了slCreateEngine这个函数用来创建声音引擎对象接口之外,其他所有的操作都是通过调用接口的成员函数完成的,这与JNI非常相似。4.停止解码,释放资源。Object和Interface是OpenSL ES库的两个非常重要的概念,OpenSL ES的整个框架就是基于这两个概念构成的,后续对该库的使用也是基于此来实现。

irainsa的博客 1386

ffmpeg mediacodec 硬解初探

ffmpeg mediacodec 硬解初探 1编译: ffmpeg自3.1版本加入了android mediacodec硬解支持,解码器如图 硬件加速器如图(还不清楚硬件加速器的功能) 编译带h264_mediacodec版本的库需要开启以下选项 --enable-jni --enable-mediacodec --enable-decoder=h264_mediacod

欢迎关注我 https://x.com/Awesome_AI_News 8262

【收藏级教程】FFmpeg音视频处理宝典:从入门到精通的50个实用技巧

FFmpeg是一套功能强大的开源跨平台多媒体处理工具集,最初由Fabrice Bellard开发。其名称来源于"Fast Forward MPEG",代表其处理MPEG视频的高效率特性。它能够实现视频转码、剪辑、合并、提取音频、添加滤镜等操作,是目前最受欢迎的多媒体处理框架之一。FFmpeg是一个强大的开源多媒体框架,可以执行几乎所有音视频文件的转换、抓取、剪辑和剪裁等处理操作。

笃行其道的博客 4647

FFmpeg入门

FFmpeg入门 播放器框架 常见音视频概念 ffmpeg库简介 ffmpeg函数简介 ffmpeg注册方式 ffmpeg数据结构简介 ffmpeg常用结构体简介 1. 播放器框架 播放器框架图,用到的api和结构体后面介绍。 2. 常见音视频概念 1. 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件,比如mp4、 flv、 mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是

努力努力再努力L 1298

FFmpeg入门到精通(一)

FFmpeg介绍 FFmpeg既是一种音视频编解码工具,也是一组音视频解码开发套件。作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg基本组成 先看图,再看字。 FFmpeg的封装模块 AVFormat AVFormat中实现了目前多媒体领域中大多数媒体封装格式,包括封装和解封装,如:MP4,FLV等文件封装格式、HTTP,RTMP,HLS等网络协议封装格式。FFm...

King 1万+
上一篇: FFmpeg+SDL2实现简易音视频同步播放器
下一篇: FFmpeg从入门到入魔(2):保存流到本地MP4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值