iOS之ffmpeg开发音视频编解码概要、SDL

66 篇文章 4 订阅
10 篇文章 4 订阅

官网:http://ffmpeg.org/documentation.html

http://ffmpeg.org/ffmpeg.html

简介:https://blog.csdn.net/qq_36688143/article/details/79162121

使用:https://www.cnblogs.com/leisure_chn/p/10040202.html

ffmpeg中文网站:http://www.ffmpeg.club

ffmpeg论坛:http://bbs.chinaffmpeg.com/forum.php

ffmpeg:腾讯云社区:https://cloud.tencent.com/developer/article/1072264

基础总结:https://blog.csdn.net/weixin_38372482/article/details/79703703

雷神:https://blog.csdn.net/leixiaohua1020/category_9262578.html

ffmpeg参数中文详细解释:https://blog.csdn.net/leixiaohua1020/article/details/12751349

图像算法ISP:https://blog.csdn.net/lz0499/article/details/71156291

DTS和PTS的解释:https://blog.csdn.net/ai2000ai/article/details/77367481

H.264码流:VBR、ABR、CBR:https://blog.csdn.net/ivy_reny/article/details/47144993

四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。https://blog.csdn.net/wangyaninglm/article/details/44020489

码率(Bitrate)、帧率(FPS)、分辨率和清晰度的联系与区别https://blog.csdn.net/pc9319/article/details/79621352

数字视频编码概述(熵编码/Huffman编码);https://blog.csdn.net/u013354805/article/details/50112353

图片大小计算(根据分辨率,位深度计算):https://blog.csdn.net/fr_han/article/details/8921641

FFMPEG结构体分析:https://blog.csdn.net/leixiaohua1020/article/details/14214577

FFmpeg编码支持与定制:不仅支持本地多媒体的处理,还支持网络流媒体的处理;FFmpeg本身支持一些音视频编码格式、文件封装格式、流媒体传输协议;但是数量有限,FFmpeg作为一套基础的框架,所有的音视频编码格式、文件封装格式、流媒体传输协议都可以作为FFmpeg的一个模块挂在在FFmpeg的框架中;这些模块以第三方外部库的方式提供支持,可通过./configure --enable-xx 添加或者./configure --disabel-xx去除;

查看第三方外部库:configure --help

查看支持的编码器: ./configure --list-encoders

查看支持的解码器: ./configure --list-decoders

查看支持的封装(复用)格式: ./configure --list-muxers

查看支持的解封装(解复用)格式: ./configure --list-demuxers

支持的流媒体协议: ./configure --list-protocols

产看ffmpeg的版本号:在ffmpeg文件夹下有一个RELEASE文件,里面放的是版本号;

 

基础概念:

容器/文件:特定格式的多媒体文件,比如mp4;

媒体流:表示时间轴上的一段连续的数据,

数据帧:编解码中最小处理单元,一般是压缩前的数据;

数据包:数据帧编解码后把多个帧组成包队列;用来存放编码后的视频帧数据;

复用器:音视频按照一定的规则放入容器,封装成特定格式就得到音视频文件;

解复用:把音视频文件按照一定的规则分解出来数据;

编解码器codec:以帧为单位实现压缩数据和原始数据之间的相互转换;

时钟:采样率,单个声音源输出只能设置一个采样率;单个声音源可以是单声道、多声道;

重采样:调整成和声卡时钟一样的频率;

dts:解码的时间,是AVPacket里的一个成员,表示压缩包应该什么时候被解码 ;如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如H.264或HEVC,当出现B帧的时候)中,编码顺序和输入顺序并不一致。于是才会需要PTS和DTS这两种不同的时间戳。

pts:显示的时间,就是这一帧图像什么时候显示给用户;

gop:关键帧的周期.

 

根据包含关系从大到小顺序排列 :  序列(GOP)-> 帧(I/IDR/P/B)-> 片组 -> 片(slice)-> 宏块(Block)-> 块(Macro  Block)-> 像素(pixel)

1.宏块(Macro Block):是H.264编码的基本单位,一个编码图像首先要划分成多个块(4x4 像素)才能进行处理,显然宏块应该是整数个块组成,通常宏块大小为16x16个像素。

宏块分为I、P、B宏块:

I宏块只能利用当前片中已解码的像素作为参考进行帧内预测;

P宏块可以利用前面已解码的图像作为参考图像进行帧内预测;

B宏块则是利用前后向的参考图形进行帧内预测

2.(Slice):一帧视频图像可编码成一个或者多个片,每片包含整数个宏块,即每片至少一个宏块,最多时包含整个图像的宏块。

     片的目的:为了限制误码的扩散和传输,使编码片相互间保持独立。

片共有5种类型:I片(只包含I宏块)、P片(P和I宏块)、B片(B和I宏块)、SP片(用于不同编码流之间的切换)和SI片(特殊类型的编码宏块)。

以下是片的句法结构:

片头规定了片的类型、属于哪个图像、有关的参考图像等;片的数据包含了一系列宏块和不编码数据。

3.片组,是一个编码图像中若干宏块的一个子集,包含一个或若干个片。

一般一个片组中,每片的宏块是按扫描次序进行编码的,除非使用任意片次序(Arbitrary Slice Order, ASO)一个编码帧中的片之后可以跟随任一解码图像的片。

4.序列

参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。
    在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。 H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流, 以I帧开始,到下一个I帧结束。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

 

编码方式

CBR:静态编码,每一秒的码流都一样;

VBR:动态编码,根据画面的复杂程度调整码流;

ABR:平均码率,是VBR的一种,在一定范围内控制码流;ABR在指定的文件大小内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。

I帧,P帧,B帧:https://www.cnblogs.com/lifan3a/articles/6667489.htmlhttps://blog.csdn.net/abcjennifer/article/details/6577934

I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成,压缩率7;P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,压缩率20。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据);B帧是双向预测内插编码帧,也就是B帧记录的是本帧与前后帧的差别,B帧的压缩率高,但是解码时CPU会比较累;压缩率50;

h264的压缩方法:H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。GOP,也就是一个序列;

1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。 
2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧; 
3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧; 
4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

宏块: 在H.264中,句法元素被组织成五个层次:序列(sequence)、图像(frame/field-picture)、片(slice)、宏块(macroblock)、子块(sub-block)。https://blog.csdn.net/ivy_reny/article/details/47144121

宏块是编码处理的基本单元,通常宏块大小为16x16个像素。一个编码图像首先要划分成多个块(4x4 像素)才能进行处理,显然宏块应该由整数个块组成. 输入的帧或场Fn以宏块为单位被编码器处理。

    视频压缩中,一幅图像(picture)可以分成一帧(frame)或两场(field)。在H.264中,一幅图像可以编码为一个或多个片(slice),每个slice由宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。宏块是H.264编码的基本单位,可以采用不同的编码类型。slice共有5种类型。slice的目的是为了限制误码的扩散和传输,使编码片相互间保持独立。一个slice编码之后被打包进一个NALU(NALU相当一个片),NALU除了容纳slice还可以容纳其它数据,如序列参数集SPS、PPS、SEI等。 

一个frame是可以分割成多个Slice来编码的,而一个Slice编码之后被打包进一个NAL单元,不过NAL单元除了容纳Slice编码的码流外,还可以容纳其他数据,比如序列参数集SPS。
(1)SODB:最原始 的编码数据,没有任何附加数据 
(2)RBSP:在 SODB 的基础上加了rbsp_stop_ont_bit(bit 值为 1)并用 0 按字节补位对齐 
(3)EBSP:在 RBSP 的基础上增加了防止伪起始码字节(0X03) 
(4)NALU是对RBSP的封装。而RTP之类的是对NALU的封装。 

AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据);是存储压缩编码数据相关信息的结构体.这是典型的解复合器的输出然后塞入解码器,或者是接收编码器的输出然后塞入复合器(解复合器 --> AVPacket --> 解码器 --> YUV/RGB --> 编码器 --> AVPacket -->复合器);对视频而言, 它通常包含一个压缩帧. 对音频而言,则它可能包含多个压缩帧;AVPacket实际上可用看作一个容器,它本身并不包含压缩的媒体数据,而是通过data指针引用数据的缓存空间。对于多个Packet共享同一个缓存空间,FFmpeg使用的引用计数的机制(reference-count):当有新的Packet引用共享的缓存空间时,就将引用计数+1;当释放了引用共享空间的Packet,就将引用计数-1;引用计数为0时,就释放掉引用的缓存空间。一般是从视频流中读取每一帧放入AVpacket中,然后AVPacket插入到packet队列中;https://blog.csdn.net/davidsguo008/article/details/72628675

在使用av_packet_alloc创建packet的时候,并没有给数据域分配空间,数据域的空间是在av_read_frame内分
配的,所以在每次循环的结束不能忘记调用av_packet_unref减少数据域的引用技术,当引用技术减为0时,会自
动释放数据域所占用的空间。在循环结束后,调用av_packet_free来释放AVPacket本身所占用的空间。

在将AVPacket加入缓冲队列如queue或deque时必须将原始的packet备份一份或者增加引用后再入队,否则该数据包会被释放。

 

AVStream是存储每一个视频/音频流信息的结构体,是一段连续的数据;视音频流对应的结构体;

AVCodec是存储编解码器信息的结构体.

AVIOContext是FFMPEG管理输入输出数据的结构体,输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等);

AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等)。

AVCodecContext:用于视音频编解码。

AVFrame:存储非压缩的数据或者说是存储的是经过解码后的原始数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据);

 

FFMPEG中结构体可以分成以下几类

a)        解协议(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)

b)        解封装(flv,avi,rmvb,mp4)

AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。

c)        解码(h264,mpeg2,aac,mp3)

每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。

d) 存数据

视频的话,每个结构一般是存一帧;音频可能有好几帧,AVFrame(存储YUV像素数据)编码为AVPacket(存储H.264等格式的码流数据)

解码前数据:AVPacket

解码后数据:AVFrame

FFmpeg中的数据结构
AVFormatContext 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。
iformat:输入视频的AVInputFormat
nb_streams :输入视频的AVStream 个数
streams :输入视频的AVStream []数组
duration :输入视频的时长(以微秒为单位)
bit_rate :输入视频的码率


AVInputFormat 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
name:封装格式名称
long_name:封装格式的长名称
extensions:封装格式的扩展名
id:封装格式ID
一些封装格式处理的接口函数


AVStream 视频文件中每个视频(音频)流对应一个该结构体。
id:序号
codec:该流对应的AVCodecContext
time_base:该流的时基
r_frame_rate:该流的帧率


AVCodecContext编码器上下文结构体,保存了视频(音频)编解码相关信息。
codec:编解码器的AVCodec
width, height:图像的宽高(只针对视频)
pix_fmt:像素格式(只针对视频)
sample_rate:采样率(只针对音频)
channels:声道数(只针对音频)
sample_fmt:采样格式(只针对音频)



AVCodec 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
name:编解码器名称
long_name:编解码器长名称
type:编解码器类型
id:编解码器ID
一些编解码的接口函数


AVPacket 存储一帧压缩编码数据。
pts:显示时间戳
dts :解码时间戳
data :压缩编码数据
size :压缩编码数据大小
stream_index :所属的AVStream


AVFrame存储一帧解码后像素(采样)数据。
data:解码后的图像像素数据(音频采样数据)。
linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。
width, height:图像的宽高(只针对视频)。
key_frame:是否为关键帧(只针对视频) 。
pict_type:帧类型(只针对视频) 。例如I,P,B。

 

视频的录制原理:

解协议
将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如 HTTP,RTMP,或是 MMS 等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用 RTMP 协议传输的数据,经过解协议操作后,输出 FLV 格式的数据。

 

 

https://www.cnblogs.com/jiankeaibiancheng/p/4594094.html

av_register_all():注册所有组件。

avformat_open_input():打开输入视频文件。

avformat_find_stream_info():获取视频文件信息。

avcodec_find_decoder():查找解码器。

avcodec_open2():打开解码器。

av_read_frame():从输入文件读取一帧压缩数据。

avcodec_decode_video2():解码一帧压缩数据。

avcodec_close():关闭解码器。

avformat_close_input():关闭输入视频文件。

编译FFmpeg:

进入FFmpeg的源码目录,执行./configure->make->make install;

默认编译的时候需要用到yasm汇编器对FFmpeg中的汇编部分进行编译;如果没有按准过yasm,则执行默认配置的时候会报错;如果用不到汇编部分的代码,则不需要安装yasm汇编器;可以使用--disable-yasm取消yasm编译配置;

安装汇编器:

1、下载 安装包http://www.tortall.net/projects/yasm/releases/

2、解压文件
tar xzvf yasm.tar.gz

3  切换目录
cd yasm-1.3.0

4、运行
./configure
//configure脚本会寻找最合适的C编译器,并生成相应的makefile文件

5、编译文件
make

6、安装软件
sudo make install


说明:
(1) 多个终端命令也可以连写,命令与命令之间采用 && 来连接,这样多个命令就会顺序执行了
比如: ./configure && make  && sudo make install
(2) 其实很多 xxx.tar.gz 文件的安装方法都是3大步:
 第一步:  ./configure   主要是生成makefile文件
 第二步:   make 编译生成二进制安装文件
 第三步: sudo make install 或 make install 安装.

ffmpeg的文件夹进行卸载清理:make uninstall

确认Makefile中指定的config.mak(在ffmpeg根目录下ffbuild文件夹中)中:CONFIG_FFPLAY=yes,如果不是,则需要执行 ./configure --enable-shared   --enable-ffplay --prefix=/ffmpeg安装路径/ffmpeg 

如果CONFIG_FFPLAY=yes前面有感叹号,说明在生成配置文件时由于某些原因并没有成功生成编译ffplay的配置,可能缺少SDL库;

查看ffplay是否成功:ffplay -version; 

FFmpeg编译方法二:如果使用HomeBrew安装FFmpeg带ffplay功能,按照下面的方法:(要提前下载好SDL)

使用HomeBrew下载安装FFmpeg并且带有ffplay功能:
在之前的版本中如果想要使用ffplay,则需要在安装ffmpeg时指定安装ffplay
brew install ffmpeg --with-ffplay
现在要使用下面:
brew install ffmpeg --with-sdl2

ffmpeg主要是解封装、编解码;SDL主要是播放视频;

SDL官网:https://www.libsdl.org/ 

SDL库:下载http://www.libsdl.org/release/

 

文档:sdl联机文档.http://www.libsdl.org/archives/sdldoc-html.zip 或http://www.libsdl.org/archives/SDLRef.chm

参考:https://blog.csdn.net/qq_29350001/article/details/76113152

详细教程:https://blog.csdn.net/lf426/category_364048_1.html

SDL (Simple DirectMedia Layer)是一套开源代码的跨平台多媒体开发库,使用C语言写成。  Simple DirectMedia Layer(SDL)是一个跨平台开发库,主要提供对音频,键盘,鼠标,操纵杆的操作,通过OpenGL和Direct3D来实现直接访问图像硬件。 主要应用在视频播放软件,模拟器和游戏开发。让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS等)的应用软件。SDL是用C编写的,我们可以使用C ++开发,同时SDL也绑了一些其他几种语言,包括C#和Python。SDL的主要任务,便是完成图像的加载,渲染显示,其他方向都比较单薄

SDL将功能分成下列数个子系统(subsystem)

Video(图像)—图像控制以及线程(thread)和事件管理(event)。

Audio(声音)—声音控制
Joystick(摇杆)—游戏摇杆控制
CD-ROM(光盘驱动器)—光盘媒体控制
Window Management(视窗管理)-与视窗程序设计集成,不过android默认就是对应的surfaceView的窗口,只允许存在一个。
Event(事件驱动)-处理事件驱动

haptic 触摸事件响应

Time 时间管理

SDL库分为 Video、Audio、CD-ROM、Game、Joystick 和 Timer 等若干子系统,除此之外,还有一些单独的官方扩充函数库。这些库由官方网站提供,并包含在官方文档中,共同组成了SDL的“标准库”,具体如下:

SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。

SDL_mixer—更多的声音输出函数以及更多的声音格式支持。支持常见的WAV,MP3,OGG等基础格式。

SDL_net—网络支持。

SDL_ttf—TrueType字体渲染支持。

SDL_rtf—简单的RTF渲染支持

如果需要安装的ffplay的话,由于ffplay依赖SDL,所以需要先安装SDL库.

SDL_image库的安装下载 http://www.libsdl.org/projects/SDL_image/release
解压下载的sdl-》cd到sdl文件-》执行./configure-》make-》make install;
查看版本:sdl2-config --version
下面的版本要更新:

预先安libpng,否则png 格式不支持,RHEL自带了相关库执行 
rpm -ivh libpng-1.2.10-7.i386.rpm 
rpm -ivh libpng-devel-1.2.10-7.i386.rpm
预先安装libjpeg,否则jpeg,gif,tiff 很多格式不支持.RHEL自带了相关库执行. 
rpm -ivh libjpeg-6b-37.i386.rpm 
rpm -ivh libjpeg-devel-6b-37.i386.rpm
解压 tar xvzf SDL_image-1.2.8.tar.gz 
cd SDL_image-1.2.8
生成makefile ./configure 
编译,安装 make & make install
    SDL_ttf库的安装

下载 http://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-2.0.9.tar.gz 
解压 tar xvzf SDL_ttf-2.0.9.tar.gz 
cd SDL_ttf-2.0.9
SDL_ttf 可以用freetype支持库 
下载 http://ftp.twaren.net/Unix/NonGNU/freetype/freetype-2.3.11.tar.gz 
解压 tar xvzf freetype-2.3.11.tar.gz 
然后./confgiure & make & make install
生成makefile ./configure 
编译,安装 make & make install

SDL-mixer库安装

下载http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.11.tar.gz 
SDL-mixer 需要libmad 支持 
下载ftp://ftp.mars.org/pub/mpeg/libmad-0.15.1b.tar.gz 
解压 tar xvzf libmad-0.15.1b.tar.gz 
然后然后./confgiure & make & make install
建议安装libid3tag库 
下载 ftp://ftp.mars.org/pub/mpeg/libid3tag-0.15.1b.tar.gz 
解压 tar xvzf libid3tag-0.15.1b.tar.gz 
然后然后./confgiure & make & make install
解压 tar xvzf SDL_mixer-1.2.9.tar.gz 
cd SDL_mixer-1.2.9
生成Makefile ./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no 
关于为什么用libmad 请参见http://blog.chinaunix.net/u3/105675/showart_2096192.html 
注意安装时,请用LINUX下的系统->管理->声卡检测来是否正常.
SDL-net库安装

  下载http://www.libsdl.org/projects/SDL_net/release/SDL_net-1.2.7.tar.gz 
解压 tar xvzf SDL_net-1.2.7.tar.gz 
 cd SDL_net-1.2.7

生成makefile ./configure 
编译,安装 make & make install

SDL-gfx库安装

主页 : http://www.ferzkopp.net/Software/SDL_gfx-2.0/

  下载http://www.ferzkopp.net/Software/SDL_gfx-2.0/SDL_gfx-2.0.20.tar.gz 
解压 tar xvzf SDL_gfx-2.0.20.tar.gz

 cd SDL_gfx-2.0.20
生成makefile ./configure 
编译,安装 make & make install

 ffmpeg和SDL的区别:

SDL是一个媒体抽象层,把显卡图形、音频、键鼠杆输入等都用统一的接口定义,让使用SDL的源码不须大改动,能在不同操作系统上的编译运行。
ffmpeg是对一些影音编解码器、容器格式读写器、效果处理滤镜的整合,提供转换和改动的统一接口。
比如用ffmpeg做数据解码,用SDL绘图显示和键鼠操控,就成了一个媒体播放器。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值