
FFMPEG
文章平均质量分 81
雷霄骅
这个作者很懒,什么都没留下…
展开
-
最简单的基于FFMPEG的推流器附件:收流器
出于对《最简单的基于FFmpeg的推流器》的补充,本文记录一个最简单的基于FFmpeg的收流器。收流器和推流器的作用正好相反:推流器用于将本地文件以流媒体的形式发送出去,而收流器用于将流媒体内容保存为本地文件。 本文记录的推流器可以将RTMP流媒体保存成为一个本地的FLV文件。由于FFmpeg本身支持很多的流媒体协议和封装格式,所以也支持其它的封装格式和流媒体协议。源代码/** * 最简单的基于原创 2015-07-18 08:47:14 · 35000 阅读 · 21 评论 -
《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频
这两天开始带广播电视工程大二的暑假小学期的课程设计了。本次小学期课程内容为《基于 FFmpeg + SDL 的视频播放器的制作》,其中主要讲述了视音频开发的入门知识。由于感觉本课程的内容不但适合本科生,而且也比较适合无视音频基础的开发者入门使用,所以在讲课的同时也录制了一部分内容并上传到了网上,方便新手学习FFmpeg的开发。原创 2015-07-26 15:00:56 · 101782 阅读 · 195 评论 -
最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld
本文记录一个安卓平台下SDL的例子。该例子读取并显示了一张BMP图片,通过该例子可以了解SDL在安卓平台下的使用。本文中使用的SDL版本为2.0。Android程序SDL2类库使用说明简单记录一下Android程序使用SDL2类库的方法。这部分的信息可以参考SDL2源代码目录中的README-android.txt文件。SDL2使用的步骤可以分为以下步骤:(1)配置Android工程a) 新建工程原创 2015-07-25 23:02:55 · 24468 阅读 · 27 评论 -
最简单的基于FFmpeg的内存读写的例子:内存转码器
上篇文章记录了一个基于FFmpeg的内存播放器,可以使用FFmpeg读取并播放内存中的数据。这篇文章记录一个基于FFmpeg的内存转码器。该转码器可以使用FFmpeg读取内存中的数据,转码之后再将数据输出到内存。关于如何从内存读取数据,以及如何将数据输出到内存,可以参考文章: FFmpeg读写内存的关键点有2个:1. 初始化自定义的AVIOContext,指定自定义的回调函数。2.原创 2014-10-05 13:30:35 · 29812 阅读 · 29 评论 -
最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
本文记录一个基于FFmpeg的libswscale的示例。Libswscale里面实现了各种图像像素格式的转换,例如YUV与RGB之间的转换;以及图像大小缩放(例如640x360拉伸为1280x720)功能。而且libswscale还做了相应指令集的优化,因此它的转换效率比自己写的C语言的转换效率高很多。原创 2014-12-28 00:46:53 · 64812 阅读 · 29 评论 -
最简单的基于FFMPEG的Helloworld程序
本文记录一个基于FFmpeg的HelloWorld程序。该程序可以打印出FFmpeg类库的基本信息。使用该程序通常可以验证FFmpeg是否正确的安装配置。原创 2015-07-17 10:43:41 · 37115 阅读 · 16 评论 -
最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)
本文记录一个更加“纯净”的基于FFmpeg的视频解码器。此前记录过基于FFmpeg的视频播放器实际上就是一个解码器:《最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)》这个播放器调用了FFmpeg中的libavformat和libavcodec两个库完成了视频解码工作。但是这不是一个“纯净”的解码器。该解码器中libavformat完成封装格式的解析,而libavcod原创 2015-01-03 14:31:33 · 69037 阅读 · 79 评论 -
[总结]FFMPEG视音频编解码零基础学习方法
在优快云上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟。“大神”们水平高超,探讨着深奥的问题;而初学者们还停留在入门阶段。究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程...原创 2013-11-16 00:04:05 · 1038812 阅读 · 922 评论 -
FFmpeg源代码结构图 - 解码
近期研究了一下FFmpeg的内部的源代码。之前对于FFmpeg的研究主要在它的应用层面上,因此制作的很多示例程序都是调用的FFmpeg的API。但是一直感觉这样对FFmpeg的理解还是比较浅,所以打算剖析一下它的源代码,理一下它内部结构的“脉络”。但是有一个很难办的问题:FFmpeg自带的三个工程:ffplay, ffmpeg, ffprobe的代码量非常的大,其中包含了成百上千的API;而这些API背后又包含了大量的FFmpeg内部函数。如此一来,几乎是不可能理清他们之间的关系的。原创 2015-03-12 14:03:16 · 136364 阅读 · 38 评论 -
FFmpeg源代码结构图 - 编码
上一篇文章深入分析了FFmpeg解码过程中核心API的内部源代码,本文继续分析FFmpeg编码过程中核心API的内部源代码。本文的编码流程可以参考程序《最简单的基于FFmpeg的视频编码器》。函数调用关系图首先呈现分析的结果,如图所示。原创 2015-03-13 14:42:15 · 56606 阅读 · 25 评论 -
ffmpeg 源代码简单分析 : av_register_all()
前一阵子看了一下ffmpeg的源代码,并且做了一些注释,在此贴出来以作备忘。本文分析一下ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。可见解复用器注册都是用REGISTER_DEMUXER (X,x)例如:REGISTER_DEM原创 2013-10-13 12:41:11 · 113234 阅读 · 33 评论 -
ffmpeg 源代码简单分析 : avcodec_register_all()
本文分析一下ffmpeg注册编解码器等的函数avcodec_register_all()(注意不是av_register_all(),那是注册所有东西的)。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用编解码器等。之前已经写过一篇文章了:ffmpeg 源代码简单分析 : av_register_all()其实注册编解码器和注册复用器解复用原创 2013-10-13 13:34:01 · 46028 阅读 · 3 评论 -
FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
本文简单记录一下FFmpeg中内存操作的函数。内存操作的常见函数位于libavutil\mem.c中。原创 2015-03-03 15:24:48 · 55995 阅读 · 9 评论 -
FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
本文简单分析FFmpeg常见结构体的初始化和销毁函数的源代码。常见的结构体在文章:《FFMPEG中最关键的结构体之间的关系》中已经有过叙述,包括:AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等)。AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。AVStream,AVCodecContext:视音频流对应原创 2015-03-03 16:25:13 · 77575 阅读 · 18 评论 -
FFmpeg源代码简单分析:avio_open2()
本文简单分析FFmpeg中一个常用的函数avio_open2()。该函数用于打开FFmpeg的输入输出文件。原创 2015-03-04 14:16:41 · 65861 阅读 · 31 评论 -
FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()
本文记录FFmpeg的两个API函数:avcodec_find_encoder()和avcodec_find_decoder()。avcodec_find_encoder()用于查找FFmpeg的编码器,avcodec_find_decoder()用于查找FFmpeg的解码器。原创 2015-03-06 12:40:06 · 32450 阅读 · 3 评论 -
FFmpeg源代码简单分析:avcodec_open2()
本文简单分析FFmpeg的avcodec_open2()函数。该函数用于初始化一个视音频编解码器的AVCodecContext。原创 2015-03-08 00:14:29 · 71032 阅读 · 16 评论 -
FFmpeg源代码简单分析:avcodec_close()
本文简单分析FFmpeg的avcodec_close()函数。该函数用于关闭编码器。原创 2015-03-12 00:06:14 · 20438 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_open_input()
本文简单分析FFmpeg中一个常用的函数:avformat_open_input()。该函数用于打开多媒体数据并且获得一些相关的信息。原创 2015-03-05 00:13:10 · 77392 阅读 · 10 评论 -
图解FFMPEG打开媒体的函数avformat_open_input
FFMPEG打开媒体的的过程开始于avformat_open_input,因此该函数的重要性不可忽视。在该函数中,FFMPEG完成了:输入输出结构体AVIOContext的初始化;输入数据的协议(例如RTMP,或者file)的识别(通过一套评分机制):1判断文件名的后缀 2读取文件头的数据进行比对;使用获得最高分的文件协议对应的URLProtocol,通过函数指针的方式,与FF原创 2013-03-11 23:44:42 · 85493 阅读 · 29 评论 -
FFmpeg源代码简单分析:avformat_find_stream_info()
本文简单分析FFmpeg中一个常用的函数:avformat_find_stream_info()。该函数可以读取一部分视音频数据并且获得一些相关的信息。原创 2015-03-06 11:15:37 · 70750 阅读 · 10 评论 -
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg中的av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧。例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame()获得一帧视频的压缩数据,然后才能对该数据进行解码(例如H.264中一帧压缩数据通常对应一个NAL)。对该函数源代码的分析是很久之前做的了,现在翻出来,用博客记录一下。av_read_frame()的源代码如下:原创 2013-10-13 15:58:49 · 161248 阅读 · 37 评论 -
ffmpeg 源代码简单分析 : avcodec_decode_video2()
ffmpeg中的avcodec_decode_video2()的作用是解码一帧视频数据。输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame。查看源代码之后发现,这个函数竟然十分的简单,源代码如下:int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,原创 2013-10-13 16:07:23 · 87903 阅读 · 24 评论 -
FFmpeg源代码简单分析:avformat_close_input()
本文简单分析FFmpeg的avformat_close_input()函数。该函数用于关闭一个AVFormatContext,一般情况下是和avformat_open_input()成对使用的。原创 2015-03-07 10:58:52 · 29044 阅读 · 4 评论 -
FFmpeg源代码简单分析:avformat_alloc_output_context2()
本文简单分析FFmpeg中常用的一个函数:avformat_alloc_output_context2()。在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av_register_all())。avformat_alloc_output_context2()函数可以初始化一个用于输出的AVFormatContext结构体。它的声明位于libavformat\a原创 2015-03-03 22:13:57 · 52827 阅读 · 13 评论 -
FFmpeg源代码简单分析:avformat_write_header()
打算写两篇文章简单分析FFmpeg的写文件用到的3个函数:avformat_write_header(),av_write_frame()以及av_write_trailer()。其中av_write_frame()用于写视频数据,avformat_write_header()用于写视频文件头,而av_write_trailer()用于写视频文件尾。本文首先分析avformat_write_hea原创 2015-03-08 18:45:57 · 54182 阅读 · 11 评论 -
FFmpeg源代码简单分析:avcodec_encode_video()
本文简单分析FFmpeg的avcodec_encode_video2()函数。该函数用于编码一帧视频数据。原创 2015-03-11 22:26:14 · 34183 阅读 · 4 评论 -
FFmpeg源代码简单分析:av_write_frame()
打算写两篇文章简单分析FFmpeg的写文件用到的3个函数avformat_write_header(),av_write_frame()以及av_write_trailer()。上篇文章已经分析了avformat_write_header(),这篇文章继续分析av_write_frame()。原创 2015-03-11 16:03:35 · 49120 阅读 · 8 评论 -
FFmpeg源代码简单分析:av_write_trailer()
打算写两篇文章简单分析FFmpeg的写文件用到的3个函数avformat_write_header(),av_write_frame()以及av_write_trailer()。这篇文章继续分析av_write_trailer()。av_write_trailer()用于输出文件尾,它的声明位于libavformat\avformat.h原创 2015-03-11 17:29:06 · 25164 阅读 · 7 评论 -
FFmpeg源代码简单分析:日志输出系统(av_log()等)
本文分析一下FFmpeg的日志(Log)输出系统的源代码。日志输出部分的核心函数只有一个:av_log()。使用av_log()在控制台输出日志的效果如下图所示。av_log()av_log()是FFmpeg中输出日志的函数。随便打开一个FFmpeg的源代码文件,就会发现其中遍布着av_log()函数。一般情况下FFmpeg类库的源代码中是不允许使用printf()这种的函数的,所有的输出一律使原创 2015-03-14 12:19:53 · 47908 阅读 · 8 评论 -
FFmpeg源代码简单分析:结构体成员管理系统-AVClass
打算写两篇文章记录FFmpeg中和AVOption有关的源代码。AVOption用于在FFmpeg中描述结构体中的成员变量。它最主要的作用可以概括为两个字:“赋值”。一个AVOption结构体包含了变量名称,简短的帮助,取值等等信息。所有和AVOption有关的数据都存储在AVClass结构体中。如果一个结构体(例如AVFormatContext或者AVCodecContext)想要支持AVOpt原创 2015-03-15 19:21:03 · 20911 阅读 · 3 评论 -
FFmpeg源代码简单分析:libswscale的sws_getContext()
打算写两篇文章记录FFmpeg中的图像处理(缩放,YUV/RGB格式转换)类库libswsscale的源代码。libswscale是一个主要用于处理图片像素数据的类库。可以完成图片像素格式的转换,图片的拉伸等工作。原创 2015-03-17 12:16:43 · 43455 阅读 · 8 评论 -
FFmpeg源代码简单分析:结构体成员管理系统-AVOption
本文继续上篇文章《FFmpeg源代码分析:结构体成员管理系统-AVClass》中的内容,记录FFmpeg中和AVOption相关的源代码。AVOption用于在FFmpeg中描述结构体中的成员变量。一个AVOption可以包含名称,简短的帮助信息,取值等等。上篇文章简单回顾上篇文章中概括了AVClass,AVOption和目标结构体之间的关系。以AVFormatContext为例,可以表示为下图。原创 2015-03-16 09:41:56 · 23345 阅读 · 3 评论 -
FFmpeg源代码简单分析:libswscale的sws_scale()
本文继续上一篇文章《FFmpeg源代码分析:sws_getContext()》的内容,简单分析FFmpeg的图像处理(缩放,YUV/RGB格式转换)类库libswsscale中的sws_scale()函数。libswscale是一个主要用于处理图片像素数据的类库。可以完成图片像素格式的转换,图片的拉伸等工作。有关libswscale的使用可以参考文章:《最简单的基于FFmpeg的libswscal原创 2015-03-17 20:02:33 · 43521 阅读 · 4 评论 -
FFmpeg源代码简单分析:libavdevice的avdevice_register_all()
本文记录一下FFmpeg中libavdevice注册设备的函数avdevice_register_all()。avdevice_register_all()的注册方式和av_register_all()、avcodec_register_all()这几个函数是类似的,具体的代码如下。原创 2015-03-24 21:49:57 · 18931 阅读 · 1 评论 -
FFmpeg源代码简单分析:libavdevice的gdigrab
本文记录FFmpeg的libavdevice中GDIGrab组件的源代码。GDIGrab用于在Windows下屏幕录像(抓屏)。它的源代码位于libavdevice\gdigrab.c。关键函数的调用关系图如下图所示。图中绿色背景的函数代表源代码中自己声明的函数,紫色背景的函数代表Win32的API函数。ff_gdigrab_demuxer在FFmpeg中Device也被当做是一种Format,因原创 2015-03-25 12:33:42 · 21472 阅读 · 18 评论 -
FFmpeg源代码简单分析:configure
本文记录FFmpeg的Configure脚本的源代码。Configure一方面用于检测FFmpeg的编译环境,另一方面根据用户配置的选项生成config.mak,config.h文件(可能还有config.asm),提供给Makefile使用。由于FFmpeg的configure脚本很复杂(一个4000-5000行的Shell脚本),难以逐行细致的分析,因此本文简单梳理一下它的结构。PS1:Con原创 2015-03-24 10:22:53 · 96719 阅读 · 12 评论 -
FFmpeg源代码简单分析:makefile
本文记录FFmpeg的Makefile的源代码。Makefile用于编译FFmpeg的源代码。通过分析Makefile文件,可以了解FFmpeg的源代码生成的流程。有关Makefile这部分我本身基础不算很牢,很多地方还在慢慢摸索,所以分析的内容不能保证完全准确。以后有时间和其他朋友多交流再慢慢完善这篇文章。注:make有一个很有用的命令:“make -n”。该选项会显示命令,但不会执行命令,十分原创 2015-03-23 11:22:29 · 40088 阅读 · 6 评论 -
最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)
本文记录一个更加“纯净”的基于FFmpeg的视频编码器。此前记录过两个基于FFmpeg的视频编码器:这个视频编码器调用了FFmpeg中的libavformat和libavcodec两个库完成了视频编码工作。但是这不是一个“纯净”的编码器。上述两个库中libavformat完成封装格式处理,而libavcodec完成编码工作。一个“纯净”的编码器,理论上说只需要使用libavcodec就足够了,并不原创 2015-01-03 12:10:48 · 29009 阅读 · 38 评论 -
最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
之前做过一个FFMPEG+SDL的简单播放器:《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》。最近有不少人反映SDL已经升级到2.0版本了,甚至官网的Wiki上都只有SDL2.0的文档了,因此下载了SDL 2.0 并且进行了简单的研究。随后对此前的播放器进行了修改,将SDL1.2换成了SDL2.0。注:《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》文章中提到的很多知识这里不再重复。本文重点记录SDL1.2与SDL2.0的不同。原创 2014-08-31 01:20:14 · 142710 阅读 · 97 评论