FFPLAY的原理(五)】的更多相关文章

创建线程 Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functions. SDL started a thread that made callbacks to a function we defined every time it needed audio. Now we're going to do the same sort of thing w…
个人总结: 1.长连接机制——分清Websocket,http2,SSE: 1)HTTP/2 引进了 Server Push 技术用来让服务器主动向客户端缓存发送数据.然而,它并不允许直接向客户端程序本身发送数据.服务端推送只能由浏览器处理而不能够在程序代码中进行处理,意即程序代码没有 API 可以用来获取这些事件的通知. 2)通过SSE(Server Side Event)来实现服务端向客户端的单向推送,SSE基于HTTP,是单向通信.  3)WebSocket是在服务端和客户端建立双工通信.…
概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置.AVI和Quicktime就是容器的例子.接着,你有一组流,例如,你经常有的是一个音频流和一个视频流.(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素).在流中的数据元素被称为帧Frame.每个流是由不同的编码器来编码生成的.编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC.Divx和 MP3就是编解码器…
显示视频 这就是我们的视频线程.现在我们看过了几乎所有的线程除了一个--记得我们调用schedule_refresh()函数吗?让我们看一下实际中是如何做的: static void schedule_refresh(VideoState *is, int delay) { SDL_AddTimer(delay, sdl_refresh_timer_cb, is); } 函数SDL_AddTimer()是SDL中的一个定时(特定的毫秒)执行用户定义的回调函数(可以带一些参数user data)的…
播放声音 现在我们要来播放声音.SDL也为我们准备了输出声音的方法.函数SDL_OpenAudio()本身就是用来打开声音设备的.它使用一个叫做SDL_AudioSpec结构体作为参数,这个结构体中包含了我们将要输出的音频的所有信息. 在我们展示如何建立之前,让我们先解释一下电脑是如何处理音频的.数字音频是由一长串的样本流组成的.每个样本表示声音波形中的一个值.声音按照一个特定 的采样率来进行录制,采样率表示以多快的速度来播放这段样本流,它的表示方式为每秒多少次采样.例如22050和44100的…
同步音频 现在我们已经有了一个比较像样的播放器.所以让我们看一下还有哪些零碎的东西没处理.上次,我们掩饰了一点同步问题,也就是同步音频到视频而不是其它的同 步方式.我们将采用和视频一样的方式:做一个内部视频时钟来记录视频线程播放了多久,然后同步音频到上面去.后面我们也来看一下如何推而广之把音频和视频 都同步到外部时钟. 生成一个视频时钟 现在我们要生成一个类似于上次我们的声音时钟的视频时钟:一个给出当前视频播放时间的内部值.开始,你可能会想这和使用上一帧的时间戳来更新定时器一样简 单.但是,不要…
概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置.AVI和Quicktime就 是容器的例子.接着,你有一组流,例如,你经常有的是一个音频流和一个视频流.(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元 素).在流中的数据元素被称为帧Frame.每个流是由不同的编码 器来编码生成的.编解码器 描 述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC.Divx和 MP3就…
1. 介绍 cache就是人们所说的缓存.我们这里所说的cache是web上的.对用户来说,衡量一个网站是否具有良好的体验,其中一个标准就是响应速度的快慢.可能网站刚上线,功能还较少,数据库的记录也不多的情况下,网站可能访问速度比较快,也不需要优化.但是随着网站发展起来,功能越来越多,数据库越来越大的时候,这个时候可能网站的访问速度就会下降.无论网站刚上线初期还是到一定程度的情况,我们都希望网站具有良好的响应速度. 而要怎样提高页面响应速度呢?其中一个方法当然就是本章所说的cache.先来说整个…
意外情况 你们将会注意到我们有一个全局变量quit,我们用它来保证还没有设置程序退出的信号(SDL会自动处理TERM类似的信号).否则,这个线程将不停地运 行直到我们使用kill -9来结束程序.FFMPEG同样也提供了一个函数来进行回调并检查我们是否需要退出一些被阻塞的函数:这个函数就是 url_set_interrupt_cb. int decode_interrupt_cb(void) { return quit; } ... main() { ... url_set_interrupt_…
关于包Packets的注释 从技术上讲一个包可以包含部分或者其它的数据,但是ffmpeg的解释器保证了我们得到的包Packets包含的要么是完整的要么是多种完整的帧. 现在我们需要做的是让SaveFrame函数能把RGB信息定稿到一个PPM格式的文件中.我们将生成一个简单的PPM格式文件,请相信,它是可以工作的. void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) { FILE *pFile; ]; int y;…