为什么要用多线程?在音视频领域主要是实现音视频同步.实现了音视频同步,我们的播放器就基本上合格了. 这里我们将讲解一下SDL的多线程与锁机制. 多线程的好处主要是能使程序更加充分利用硬件(主要是CPU)的性能.但是也存在相应的隐患,如果多线程管理不好,会出现协调问题. 引进的机制:线程的互斥与同步 互斥:同一个资源在一定时间内只能由一个方法访问. 同步:一个方法完成后的内容需要同步到其他的方法,在由其他方法操作完成后的内容. 锁与信号量 锁用于完成互斥:信号量用于同步. 锁的种类:读写锁.自旋锁…
在上一篇文章 SDL 开发实战(一):SDL介绍及开发环境配置 中,我们配置好了SDL的开发环境,并成功运行了SDL的Hello World 代码.但是可能大部分人还是读不太明白具体Hello Wold的代码的意义.下面我们来根据SDL的使用思路来讲解一下SDL核心API,各位可以将此文结合上一篇文章,我们写的HelloWorld代码进行理解和思考. 基本的SDL的使用思路,基本分为三部分:初始化 ---> 循环渲染 ---> 销毁释放资源. SDL 初始化相关方法 : SDL_Init():…
在上文 SDL 开发实战(二):SDL 2.0 核心 API 解析 我们讲解了SDL最核心的API,并结合Hello World代码了解了SDL渲染画面的基本原理. 本文我们来讲一下,如何使用SDL的API绘制基本的图形. SDL中绘制基本图形的 API并不多,主要是 点.线.矩形.填充矩形.其它图形都可以通过 点.线.矩形组合出来. 0.设置画笔的颜色 设置画笔颜色是绘制图形的首要步骤,函数方法为SDL_SetRenderDrawColor,下面是函数的原型: int SDL_SetRende…
C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL); //线程退出 } pthread_t *pt = (pthread_t *)malloc(num_threads * sizeof(pthread_t)); //创建 num_threads 个线程 for (a = 0; a < num_threads; a++) pthread_create(&…
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. JDK1.5以后引入了自旋锁.锁粗化.轻量级锁,偏向锁来有优化关键字的性能. 一个线程访问一个被synchronized修饰的代码块,会自动获取对应的一个锁,并在执行该代码块时,其他线程想访问这个代码块,会一直处于等待状态,自有等该线程释放锁后,其他线程进行资源竞争,竞争获取到锁的线程才能访问该…
本文我们讲一下如何使用SDL_Texture将视频纹理渲染出来. 1. SDL 视频渲染相关对象 SDL 视频渲染主要涉及到四个对象:SDL_Window.SDL_Render.SDL_Texture和SDL_Surface. SDL_Window代表的是窗口的逻辑概念,它是存放在主内存中的一个对象.当我们调用SDL API 创建窗口后,它并不会被显示出来. SDL_Render 是渲染器,它也是主存中的一个对象.对Render操作时实际上分为两个阶段: 渲染阶段.在该阶段,用户可以画各种图形渲…
一.什么是SDL? SDL是 “Simple DirectMedia Layer”的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度. SDL使用C语言写成,提供了数种控制图像.声音.输出入的函数,可以开发出跨多个平台(Linux.Windows.Mac OS X等)的应用软件.目前多用于开发游戏.模拟器.媒体播放器等多媒体应用领域. 1. SDL 库分类 SDL库分为 Video.Audio.CD-ROM.Joystick 和 Timer 等若干子系…
当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名Java的锁机制,阐述多线程下如何使用锁机制进行并发线程沟通. 1.并发下的程序异常 先看下下面两个代码,查看异常内容. 异常1:单例模式 package com.scl.thread; public class SingletonException { public static void mai…
在上文,我们做了YUV播放器,这样我们就入门了SDL播放视频.下面我们来做一个PCM播放,即使用SDL播放PCM数据. 下面说明一下使用SDL播放PCM音频的基本流程,主要分为两大部分:初始化SDL.循环播放数据. 1. 初始化SDL 1). 初始化SDL 执行的方法为SDL_Init(SDL_INIT_AUDIO) 2). 打开音频设备 使用SDL_OpenAudio()打开音频设备.该函数需要传入一个SDL_AudioSpec的结构体. 这里SDL_OpenAudio() 函数的原型为: i…
前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分:初始化SDL.循环显示画面. 1. 初始化SDL 1). 初始化SDL (SDL_Init)2). 创建窗口(SDL_CreateWindow)3). 基于窗口创建渲染器(SDL_CreateRenderer)4). 创建纹理(SDL_CreateTexture) 2. 循环显示画面 1). 设置纹…