sdl_sdl2 - CSDN
sdl 订阅
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。 展开全文
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
信息
外文名
SDL
广泛的用于
许多著名的游戏
性    质
开放源代码的跨平台多媒体开发库
全    称
Simple DirectMedia Layer
SDL简介
SDL(Simple DirectMedia Layer)被广泛的用于许多著名的游戏。最著名的游戏是赢得Linux组游戏开发大奖的 文明:权利的召唤(Civilization: Call To Power)。SDL的作者是Sam Lantinga, Loki Entertainment Software的主力程序员(Lead Programmer)。
收起全文
  • SDL介绍

    2013-11-16 11:05:05
    SDL库的作用说白了就是封装了复杂的视音频底层操作,简化了视音频处理的难度。 以下转自WiKi: SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、...

    SDL库的作用说白了就是封装了复杂的视音频底层操作,简化了视音频处理的难度。

    以下转自WiKi:


    SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
    SDL使用GNU宽通用公共许可证为授权方式,意指动态链接(dynamic link)其库并不需要开放本身的源代码。因此诸如《雷神之锤4》等商业游戏也使用SDL来开发。


    结构
    虽然SDL时常被比较为‘跨平台的DirectX’,然而事实上SDL是定位成以精简的方式来完成基础的功能,它大幅度简化了控制图像、声音、输出入等工作所需撰写的代码。但更高级的绘图功能或是音效功能则需搭配OpenGL和OpenAL等API来达成。另外它本身也没有方便创建图形用户界面的函数。
    SDL在结构上是将不同操作系统的库再包装成相同的函数,例如SDL在Windows平台上其实是DirectX的再包装,旧版本包装的是DirectX 5,现时的版本(SDL 1.2)则是DirectX 7。而在使用X11的平台上(包括Linux),SDL则是与Xlib库沟通来输出图像。
    虽然SDL本身是使用C语言写成,但是它几乎可以被所有的编程语言所使用,例如:C++、Perl、Python(借由pygame库)、Pascal等等,甚至是Euphoria、Pliant这类较不流行的编程语言也都可行。
    SDL库分为 Video、Audio、CD-ROM、Joystick 和 Timer 等若干子系统,除此之外,还有一些单独的官方扩充函数库。这些库由官方网站提供,并包含在官方文档中,共同组成了SDL的“标准库”:
    SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。
    SDL_mixer—更多的声音输出函数以及更多的声音格式支持。
    SDL_net—网络支持。
    SDL_ttf—TrueType字体渲染支持。
    SDL_rtf—简单的RTF渲染支持。


    子系统
    SDL将功能分成下列数个子系统(subsystem):
    Video(图像)—图像控制以及线程(thread)和事件管理(event)。
    Audio(声音)—声音控制
    Joystick(摇杆)—游戏摇杆控制
    CD-ROM(光盘驱动器)—光盘媒体控制
    Window Management(视窗管理)-与视窗程序设计集成
    Event(事件驱动)-处理事件驱动
    以下是一支用C语言写成、非常简单的SDL示例:

    // Headers
    #include "SDL.h"
     
    // Main function
    int main(int argc, char* argv[])
    {
        // Initialize SDL
        if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
            return(1);
     
        // Delay 2 seconds
        SDL_Delay(2000);
     
        // Quit SDL
        SDL_Quit();
     
        // Return
        return 0;
    }


    SDL与DirectX比较对应关系:

    SDL DirectX 说明
    SDL_Video、SDL_Image、OpenGL DirectDraw、Direct3D  
    SDL_Audio、SDL_Mixer DirectSound  
    SDL_Joystick、SDL_Base DirectInput  
    SDL_Net DirectPlay  
    SMPEG、SDL_Video、SDL_Audio、SDL_Sound、SDL_Filter DirectShow  

    使用SDL开发的游戏:

    《Spore》
    《Tux Paint》
    《Simutrans》
    《Stepmania》
    《Frozen Bubble》
    《无冬之夜》(Neverwinter Nights)
    《魔法门之英雄无敌III》(Heroes of Might and Magic III)(Linux版)
    《模拟城市3000》(Sim City 3000)(Linux版)
    《虚幻竞技场》(Unreal Tournament)(Linux版)
    《虚幻竞技场2003》(Unreal Tournament 2003)(Linux版)
    《虚幻竞技场2004》(Unreal Tournament 2004)(Linux版)
    《第二人生》(Second Life)(Linux版)
    《佣兵战场》(Soldier of Fortune)(Linux版)
    《韦诺之战》(Battle for Wesnoth)
    Bos Wars

    展开全文
  • 基于FFmpeg+SDL的视频播放器的制作的入门级课程,视频资料、ppt、代码、使用到的工具、测试音视频上传到百度云,方便您的下载。 这个课程通俗易懂,内容翔实,是您从ffmpeg、sdl门外汉到高手的很好的一课。学习...
  • SDL强大不用解释,全面学习了解是必须的。
  • FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚...该播放器虽然简单,但是几乎包含了使用FFMPEG播放一个音频所有必备的API,并且使用SDL输出解码出来的音频。 并且支持流媒体等多种音频输入。 程序使用了新的F

    =====================================================

    最简单的基于FFmpeg的音频播放器系列文章列表:

    《最简单的基于FFMPEG+SDL的音频播放器》

    《最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)》

    《最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器》

    =====================================================


    简介

    FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。

    在此我把自己做项目过程中实现的一个非常简单的音频播放器(大约200行代码)源代码传上来,以作备忘,同时方便新手学习FFMPEG。

    该播放器虽然简单,但是几乎包含了使用FFMPEG播放一个音频所有必备的API,并且使用SDL输出解码出来的音频。

    并且支持流媒体等多种音频输入。程序使用了新的FFMPEG类库,和早期版本的FFMPEG类库的API函数略有不同。平台使用VC2010。


    SourceForge项目主页

    https://sourceforge.net/projects/simplestffmpegaudioplayer/


    注:本版本的SDL采用了SDL1.2,采用SDL2.0的播放器可以参考:

    最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)


    注意:

    1.程序输出的解码后PCM音频数据可以使用Audition打开播放

    2.m4a,aac文件可以直接播放。mp3文件需要调整SDL音频帧大小为4608(默认是4096),否则播放会不流畅

    3.也可以播放视频中的音频


    源代码

    /**
     * 最简单的基于FFmpeg的音频播放器  1.2
     * Simplest FFmpeg Audio Player  1.2
     *
     * 雷霄骅 Lei Xiaohua
     * leixiaohua1020@126.com
     * 中国传媒大学/数字电视技术
     * Communication University of China / Digital TV Technology
     * http://blog.csdn.net/leixiaohua1020
     *
     * 本程序实现了音频的解码和播放。
     *
     * This software decode and play audio streams.
     */
    
    #include "stdafx.h"
    #include <stdlib.h>
    #include <string.h>
    extern "C"
    {
    #include "libavcodec/avcodec.h"
    #include "libavformat/avformat.h"
    #include "libswresample/swresample.h"
    //SDL
    #include "sdl/SDL.h"
    };
    
    #define MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
    
    
    //Output PCM
    #define OUTPUT_PCM 1
    //Use SDL
    #define USE_SDL 1
    
    //Buffer:
    //|-----------|-------------|
    //chunk-------pos---len-----|
    static  Uint8  *audio_chunk; 
    static  Uint32  audio_len; 
    static  Uint8  *audio_pos; 
    
    /* The audio function callback takes the following parameters: 
     * stream: A pointer to the audio buffer to be filled 
     * len: The length (in bytes) of the audio buffer 
     * 回调函数
    */ 
    void  fill_audio(void *udata,Uint8 *stream,int len){ 
    	if(audio_len==0)		/*  Only  play  if  we  have  data  left  */ 
    			return; 
    	len=(len>audio_len?audio_len:len);	/*  Mix  as  much  data  as  possible  */ 
    
    	SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);
    	audio_pos += len; 
    	audio_len -= len; 
    } 
    //-----------------
    
    
    int main(int argc, char* argv[])
    {
    	AVFormatContext	*pFormatCtx;
    	int				i, audioStream;
    	AVCodecContext	*pCodecCtx;
    	AVCodec			*pCodec;
    
    	char url[]="WavinFlag.aac";
    	//char url[]="WavinFlag.mp3";
    	//char url[]="72bian.wma";
    
    	av_register_all();
    	avformat_network_init();
    	pFormatCtx = avformat_alloc_context();
    	//Open
    	if(avformat_open_input(&pFormatCtx,url,NULL,NULL)!=0){
    		printf("Couldn't open input stream.\n");
    		return -1;
    	}
    	// Retrieve stream information
    	if(av_find_stream_info(pFormatCtx)<0){
    		printf("Couldn't find stream information.\n");
    		return -1;
    	}
    	// Dump valid information onto standard error
    	av_dump_format(pFormatCtx, 0, url, false);
    
    	// Find the first audio stream
    	audioStream=-1;
    	for(i=0; i < pFormatCtx->nb_streams; i++)
    		if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
    			audioStream=i;
    			break;
    		}
    
    	if(audioStream==-1){
    		printf("Didn't find a audio stream.\n");
    		return -1;
    	}
    
    	// Get a pointer to the codec context for the audio stream
    	pCodecCtx=pFormatCtx->streams[audioStream]->codec;
    
    	// Find the decoder for the audio stream
    	pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
    	if(pCodec==NULL){
    		printf("Codec not found.\n");
    		return -1;
    	}
    
    	// Open codec
    	if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){
    		printf("Could not open codec.\n");
    		return -1;
    	}
    
    	FILE *pFile=NULL;
    #if OUTPUT_PCM
    	pFile=fopen("output.pcm", "wb");
    #endif
    
    	AVPacket *packet=(AVPacket *)malloc(sizeof(AVPacket));
    	av_init_packet(packet);
    
    	//Out Audio Param
    	uint64_t out_channel_layout=AV_CH_LAYOUT_STEREO;
    	//AAC:1024  MP3:1152
    	int out_nb_samples=pCodecCtx->frame_size;
    	AVSampleFormat out_sample_fmt=AV_SAMPLE_FMT_S16;
    	int out_sample_rate=44100;
    	int out_channels=av_get_channel_layout_nb_channels(out_channel_layout);
    	//Out Buffer Size
    	int out_buffer_size=av_samples_get_buffer_size(NULL,out_channels ,out_nb_samples,out_sample_fmt, 1);
    
    	uint8_t *out_buffer=(uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE*2);
    
    	AVFrame	*pFrame;
    	pFrame=avcodec_alloc_frame();
    //SDL------------------
    #if USE_SDL
    	//Init
    	if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {  
    		printf( "Could not initialize SDL - %s\n", SDL_GetError()); 
    		return -1;
    	}
    	//SDL_AudioSpec
    	SDL_AudioSpec wanted_spec;
    	wanted_spec.freq = out_sample_rate; 
    	wanted_spec.format = AUDIO_S16SYS; 
    	wanted_spec.channels = out_channels; 
    	wanted_spec.silence = 0; 
    	wanted_spec.samples = out_nb_samples; 
    	wanted_spec.callback = fill_audio; 
    	wanted_spec.userdata = pCodecCtx; 
    
    	if (SDL_OpenAudio(&wanted_spec, NULL)<0){ 
    		printf("can't open audio.\n"); 
    		return -1; 
    	} 
    #endif
    	printf("Bitrate:\t %3d\n", pFormatCtx->bit_rate);
    	printf("Decoder Name:\t %s\n", pCodecCtx->codec->long_name);
    	printf("Channels:\t %d\n", pCodecCtx->channels);
    	printf("Sample per Second\t %d \n", pCodecCtx->sample_rate);
    
    	uint32_t ret,len = 0;
    	int got_picture;
    	int index = 0;
    	//FIX:Some Codec's Context Information is missing
    	int64_t in_channel_layout=av_get_default_channel_layout(pCodecCtx->channels);
    	//Swr
    	struct SwrContext *au_convert_ctx;
    	au_convert_ctx = swr_alloc();
    	au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,
    		in_channel_layout,pCodecCtx->sample_fmt , pCodecCtx->sample_rate,0, NULL);
    	swr_init(au_convert_ctx);
    
    	//Play
    	SDL_PauseAudio(0);
    
    	while(av_read_frame(pFormatCtx, packet)>=0){
    		if(packet->stream_index==audioStream){
    
    			ret = avcodec_decode_audio4( pCodecCtx, pFrame,&got_picture, packet);
    			if ( ret < 0 ) {
                    printf("Error in decoding audio frame.\n");
                    return -1;
                }
    			if ( got_picture > 0 ){
    				swr_convert(au_convert_ctx,&out_buffer, MAX_AUDIO_FRAME_SIZE,(const uint8_t **)pFrame->data , pFrame->nb_samples);
    
    				printf("index:%5d\t pts:%lld\t packet size:%d\n",index,packet->pts,packet->size);
    
    #if OUTPUT_PCM
    				//Write PCM
    				fwrite(out_buffer, 1, out_buffer_size, pFile);
    #endif
    				
    				index++;
    			}
    //SDL------------------
    #if USE_SDL
    			//Set audio buffer (PCM data)
    			audio_chunk = (Uint8 *) out_buffer; 
    			//Audio buffer length
    			audio_len =out_buffer_size;
    
    			audio_pos = audio_chunk;
    
    			while(audio_len>0)//Wait until finish
    				SDL_Delay(1); 
    #endif
    		}
    		av_free_packet(packet);
    	}
    
    	swr_free(&au_convert_ctx);
    
    #if USE_SDL
    	SDL_CloseAudio();//Close SDL
    	SDL_Quit();
    #endif
    
    #if OUTPUT_PCM
    	fclose(pFile);
    #endif
    	av_free(out_buffer);
    	avcodec_close(pCodecCtx);
    	av_close_input_file(pFormatCtx);
    
    	return 0;
    }
    
    




    结果

    程序会打印每一帧的信息,同时将音频输出到音频输出设备。运行截图如下所示。



    完整工程下载地址:

    http://download.csdn.net/detail/leixiaohua1020/6033893


    更新列表


    更新(2014.5.8)===============================================


    simplest ffmpeg audio player

    完整工程(更新版)下载地址:

    http://download.csdn.net/detail/leixiaohua1020/7319225

    新版本中使用了最新版本的FFMPEG类库(2014.5.7)。FFMPEG在新版本中的音频解码方面发生了比较大的变化。如果将旧版的主程序和新版的类库组合使用的话,会出现听到的都是杂音这一现象。经过研究发现,新版中avcodec_decode_audio4()解码后输出的音频采样数据格式为AV_SAMPLE_FMT_FLTP(float, planar)而不再是AV_SAMPLE_FMT_S16(signed 16 bits)。因此无法直接使用SDL进行播放。

    最后的解决方法是使用SwrContext对音频采样数据进行转换之后,再进行输出播放,问题就可以得到解决了。转换方面的代码如下示例:

    //输出音频数据大小,一定小于输出内存。
    int out_linesize;
    //输出内存大小
    int out_buffer_size=av_samples_get_buffer_size(&out_linesize, pCodecCtx->channels,pCodecCtx->frame_size,pCodecCtx->sample_fmt, 1);
    uint8_t *out_buffer=new uint8_t[out_buffer_size];
    ...
    au_convert_ctx = swr_alloc();
    au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 44100,
    	pCodecCtx->channel_layout,pCodecCtx->sample_fmt , pCodecCtx->sample_rate,0, NULL);
    swr_init(au_convert_ctx);
    
    while(av_read_frame(pFormatCtx, packet)>=0){
    	......
    	swr_convert(au_convert_ctx,&out_buffer, out_linesize,(const uint8_t **)pFrame->data , pFrame->nb_samples);
    
    	......
    }

    更新(2014.9.1)===============================================


    simplest ffmpeg audio player classic

    完整工程(classic)下载地址:

    http://download.csdn.net/detail/leixiaohua1020/7849625


    本版本使用的类库编译时间为2012年的,无需经过swr_convert()即可播放,代码简洁。

    重建了工程,删掉了不必要的代码,把代码修改得更规范更易懂。

    可以通过宏控制是否使用SDL,以及是否输出PCM。

    //Output PCM
    #define OUTPUT_PCM 0
    //Use SDL
    #define USE_SDL 1


    更新(2014.9.2)===============================================


    simplest ffmpeg audio player 1.2

    完整工程下载地址:

    http://download.csdn.net/detail/leixiaohua1020/7853199


    本版本使用新的类库(2014.5.6),解码后的音频需要经过swr_convert()转换后方可播放。

    重建了工程,删掉了不必要的代码,把代码修改得更规范更易懂。

    可以通过宏控制是否使用SDL,以及是否输出PCM。

    此外修改了部分地方,在原先版本的基础上,支持更多种的音频格式:AAC,MP3...

    这一版本后不再修正这个音频播放器,以后改为修正基于SDL2.0的音频播放器

    =============================================================


    FFMPEG相关学习资料:

    SDL GUIDE 中文译本

    ffdoc (FFMPEG的最完整教程)
    如何用FFmpeg编写一个简单播放器



    展开全文
  • 这是一个音视频技术的系列教程,每一季会向大家展示一个方面的音视频技术,着重简单实用。本季是实现一个播放器。在课程组织上并不是一上来就设计好一个软件架构,而是从具体的视频技术入手,一点一点的抽丝剥茧,在...
  • SDL简介

    2018-06-06 17:37:51
    由于之前玩ffmpeg的时候,经常遇到的就是SDL。但是当时没有时间来细化的学习SDL,也没有什么概念。现在就来记录下自学的过程首先我们需要知道 什么是SDLSDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的...

    由于之前玩ffmpeg的时候,经常遇到的就是SDL。但是当时没有时间来细化的学习SDL,也没有什么概念。
    现在就来记录下自学的过程

    首先我们需要知道  什么是SDL

    SDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的项目

    SDL可以用来做啥?

    为多媒体编程而设计

    SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频、视频、键盘、鼠标、控制杆及3D硬件的低级别的访问接口。它在MPEG播放软件、模拟器以及许多游戏中得到广泛的应用,其中包含了获得大奖的“文明:权力的呼唤”的Linux 版本。


    支持多种程序语言

    SDL是用C编写的,但可以原生地配合C++使用,并且它拥有一些其他程序语言的绑定,这包括:Ada, C#, D, Eiffel, Erlang, Euphoria, Go, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, 以及 Tcl。


    优越的跨平台特性

    SDL支持以下操作系统:Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,以及 QNX。同时代码中包含了针对AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, 和OS/2的支持,但这些并不是正式的支持。


    因为开源,所以自由

    SDL采用GNU的LGPL第二版许可发行。该许可允许你自由地链接其动态链接库,甚至可以在商业软件中自由地使用。



    展开全文
  • SDL介绍和简单实用

    2018-06-14 14:54:36
    SDL库的作用说白了就是封装了复杂的视音频底层操作,简化了视音频处理的难度。以下转自WiKi:SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、...

    SDL库的作用说白了就是封装了复杂的视音频底层操作,简化了视音频处理的难度。

    以下转自WiKi:


    SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
    SDL使用GNU宽通用公共许可证为授权方式,意指动态链接(dynamic link)其库并不需要开放本身的源代码。因此诸如《雷神之锤4》等商业游戏也使用SDL来开发。


    结构
    虽然SDL时常被比较为‘跨平台的DirectX’,然而事实上SDL是定位成以精简的方式来完成基础的功能,它大幅度简化了控制图像、声音、输出入等工作所需撰写的代码。但更高级的绘图功能或是音效功能则需搭配OpenGL和OpenAL等API来达成。另外它本身也没有方便创建图形用户界面的函数。
    SDL在结构上是将不同操作系统的库再包装成相同的函数,例如SDL在Windows平台上其实是DirectX的再包装,旧版本包装的是DirectX 5,现时的版本(SDL 1.2)则是DirectX 7。而在使用X11的平台上(包括Linux),SDL则是与Xlib库沟通来输出图像。
    虽然SDL本身是使用C语言写成,但是它几乎可以被所有的编程语言所使用,例如:C++、Perl、Python(借由pygame库)、Pascal等等,甚至是Euphoria、Pliant这类较不流行的编程语言也都可行。
    SDL库分为 Video、Audio、CD-ROM、Joystick 和 Timer 等若干子系统,除此之外,还有一些单独的官方扩充函数库。这些库由官方网站提供,并包含在官方文档中,共同组成了SDL的“标准库”:
    SDL_image—支持时下流行的图像格式:BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。
    SDL_mixer—更多的声音输出函数以及更多的声音格式支持。
    SDL_net—网络支持。
    SDL_ttf—TrueType字体渲染支持。
    SDL_rtf—简单的RTF渲染支持。


    子系统
    SDL将功能分成下列数个子系统(subsystem):
    Video(图像)—图像控制以及线程(thread)和事件管理(event)。
    Audio(声音)—声音控制
    Joystick(摇杆)—游戏摇杆控制
    CD-ROM(光盘驱动器)—光盘媒体控制
    Window Management(视窗管理)-与视窗程序设计集成

    Event(事件驱动)-处理事件驱动


    SDL视频显示函数简介
    ▫ SDL_Init():初始化SDL系统
    ▫ SDL_CreateWindow():创建窗口SDL_Window
    ▫ SDL_CreateRenderer():创建渲染器SDL_Renderer
    ▫ SDL_CreateTexture():创建纹理SDL_Texture
    ▫ SDL_UpdateTexture():设置纹理的数据
    ▫ SDL_RenderCopy():将纹理的数据拷贝给渲染器
    ▫ SDL_RenderPresent():显示
    ▫ SDL_Delay():工具函数,用于延时。

    ▫ SDL_Quit():退出SDL系统

    SDL数据结构简介
    ▫ SDL_Window 代表了一个“窗口”
    ▫ SDL_Renderer 代表了一个“渲染器”
    ▫ SDL_Texture 代表了一个“纹理”

    ▫ SDL_Rect 一个简单的矩形结构

    SDL多线程
    函数
    SDL_CreateThread():创建一个线程
    数据结构
    DL_Thread:线程的句柄
    SDL事件
    函数
    SDL_WaitEvent()等待一个事件
    SDL_PushEvent()发送一个事件
    数据结构
    SDL_Event:代表一个事件


    以下是一支用C语言写成、非常简单的SDL示例:

    /**
     * 最简单的SDL2播放视频的例子(SDL2播放RGB/YUV)
     * Simplest Video Play SDL2 (SDL2 play RGB/YUV) 
     *
     * 雷霄骅 Lei Xiaohua
     * leixiaohua1020@126.com
     * 中国传媒大学/数字电视技术
     * Communication University of China / Digital TV Technology
     * http://blog.csdn.net/leixiaohua1020
     *
     * 本程序使用SDL2播放RGB/YUV视频像素数据。SDL实际上是对底层绘图
     * API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层
     * API。
     *
     * This software plays RGB/YUV raw video data using SDL2.
     * SDL is a wrapper of low-level API (Direct3D, OpenGL).
     * Use SDL is much easier than directly call these low-level API.  
     */
    
    #include <stdio.h>
    
    extern "C"
    {
    #include "sdl/SDL.h"
    };
    
    const int bpp=12;
    
    int screen_w=500,screen_h=500;
    const int pixel_w=320,pixel_h=180;
    
    unsigned char buffer[pixel_w*pixel_h*bpp/8];
    
    //Refresh Event
    #define REFRESH_EVENT  (SDL_USEREVENT + 1)
    //Break
    #define BREAK_EVENT  (SDL_USEREVENT + 2)
    
    int thread_exit=0;
    
    //每隔40毫秒向SDL系统发送一个REFRESH_EVENT事件
    int refresh_video(void *opaque){
    	thread_exit=0;
    	while (thread_exit==0) {
    		SDL_Event event;
    		event.type = REFRESH_EVENT;
    		SDL_PushEvent(&event);
    		SDL_Delay(40);
    	}
    	thread_exit=0;
    	//Break
    	SDL_Event event;
    	event.type = BREAK_EVENT;
    	SDL_PushEvent(&event);
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	if(SDL_Init(SDL_INIT_VIDEO)) {  
    		printf( "Could not initialize SDL - %s\n", SDL_GetError()); 
    		return -1;
    	} 
    
    	SDL_Window *screen; 
    	//SDL 2.0 Support for multiple windows
    	screen = SDL_CreateWindow("Simplest Video Play SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
    		screen_w, screen_h,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
    	if(!screen) {  
    		printf("SDL: could not create window - exiting:%s\n",SDL_GetError());  
    		return -1;
    	}
    	SDL_Renderer* sdlRenderer = SDL_CreateRenderer(screen, -1, 0);  
    
    	Uint32 pixformat=0;
    	//IYUV: Y + U + V  (3 planes)
    	//YV12: Y + V + U  (3 planes)
    	pixformat= SDL_PIXELFORMAT_IYUV;  
    
    	SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer,pixformat, SDL_TEXTUREACCESS_STREAMING,pixel_w,pixel_h);
    
    	FILE *fp=NULL;
    	fp=fopen("test_yuv420p_320x180.yuv","rb+");
    
    	if(fp==NULL){
    		printf("cannot open this file\n");
    		return -1;
    	}
    
    	SDL_Rect sdlRect;  
    
    	SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video,NULL,NULL);
    	SDL_Event event;
    	while(1){
    		//收取SDL系统里面的事件
    		SDL_WaitEvent(&event);
    		if(event.type==REFRESH_EVENT){
    			if (fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp) != pixel_w*pixel_h*bpp/8){
    				// Loop
    				fseek(fp, 0, SEEK_SET);
    				fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp);
    			}
    
    			SDL_UpdateTexture( sdlTexture, NULL, buffer, pixel_w);  
    
    			//FIX: If window is resize
    			sdlRect.x = 0;  
    			sdlRect.y = 0;  
    			sdlRect.w = screen_w;  
    			sdlRect.h = screen_h;  
    			
    			SDL_RenderClear( sdlRenderer );   
    			SDL_RenderCopy( sdlRenderer, sdlTexture, NULL, &sdlRect);  
    			SDL_RenderPresent( sdlRenderer );  
    			
    		}else if(event.type==SDL_WINDOWEVENT){
    			//If Resize
    			SDL_GetWindowSize(screen,&screen_w,&screen_h);
    		}else if(event.type==SDL_QUIT){
    			thread_exit=1;
    		}else if(event.type==BREAK_EVENT){
    			break;
    		}
    	}
    	SDL_Quit();
    	return 0;
    }
    

    SDL与DirectX比较对应关系:

    SDLDirectX说明
    SDL_Video、SDL_Image、OpenGLDirectDraw、Direct3D 
    SDL_Audio、SDL_MixerDirectSound 
    SDL_Joystick、SDL_BaseDirectInput 
    SDL_NetDirectPlay 
    SMPEG、SDL_Video、SDL_Audio、SDL_Sound、SDL_FilterDirectShow 

    使用SDL开发的游戏:

    《Spore》
    《Tux Paint》
    《Simutrans》
    《Stepmania》
    《Frozen Bubble》
    《无冬之夜》(Neverwinter Nights)
    《魔法门之英雄无敌III》(Heroes of Might and Magic III)(Linux版)
    《模拟城市3000》(Sim City 3000)(Linux版)
    《虚幻竞技场》(Unreal Tournament)(Linux版)
    《虚幻竞技场2003》(Unreal Tournament 2003)(Linux版)
    《虚幻竞技场2004》(Unreal Tournament 2004)(Linux版)
    《第二人生》(Second Life)(Linux版)
    《佣兵战场》(Soldier of Fortune)(Linux版)
    《韦诺之战》(Battle for Wesnoth)

    Bos Wars


    SDL详细教程:

    https://blog.csdn.net/lf426/article/category/364048/1

    展开全文
  • 关于SDL,在简介里面,有一些概念,但是很多人还是留言,不清楚到底是个什么。这节,我简单总结下:我们如何将一张图显示在屏幕上。这里简单的分为几个部分,硬件屏幕,驱动程序,软件部分。SDL不直接关注硬件屏幕,...
  • 因为Linux的普及以及不受$M的牵制,SDL在过去的几年中,成为了跨平台开发PC游戏的首选。即使是在Windows平台下,SDL有具有自身的优势。与MFC使用不成熟的C++外表伪封装的win32api以及一家独唱推崇的COM风格和.net相...
  • 之前做过一个FFMPEG+SDL的简单播放器:《100行代码实现最简单的基于FFMPEG+SDL的视频播放器》。最近有不少人反映SDL已经升级到2.0版本了,甚至官网的Wiki上都只有SDL2.0的文档了,因此下载了SDL 2.0 并且进行了简单...
  • FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。...该播放器虽然简单,但是几乎包含了使用FFMPEG播放一个视频所有必备的API,并且使用SDL显示解码出来的视频。 并且
  • 打算花一段时间研究一下SDL的内部代码。前面几篇文章《最简单的视音频播放示例1:总述》中记录了视频、音频播放的技术,文中提及了SDL实际上封装了Direct3D,DirectSound这类的底层API。但是SDL究竟是如何封装的呢?...
  • 本教程为一个长系列,旨在于从零开始边学习SDL边开发游戏。 一.什么是SDLSDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让...
  • 本文记录SDL播放音频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这...
  • android studio编译SDL2生成.so文件时,报错如下: ``` Build command failed. Error while executing process /Users/ing/sdk/ndk-bundle/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=...
  • SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四) demo讲解 SDL系列讲解(五) 调试c代码 前言总是会出其不意,...
  • 关于游戏开发,当前还在调试,一款移植的随后先推出,自己开发的需要稍等几周,近期比较忙,时间不充裕,大家谅解。同时,对于android开发中的任意问题,可以留言,想了解哪方向的知识,可以回复,如果有能力,...SDL
  • sdl2初级教程

    2020-07-25 23:30:59
    本书面向的对象为SDL2初学者。 或正在使用C4droid练习c/c++语音的中学生高中生等。 本书介绍了SDL2上基础的几个部分,学完本书相信大家基本学会了SDL2的使用方法。对于本书的源码全部在 Android平台C4droid用g++...
  • 本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这...
  • SDL起步——SDL2的配置

    2016-02-06 13:33:49
    小编前段时间学习了SDL,并使用SDL写了几个小应用和一个很简单小游戏,由于前段时间小编事务比较繁忙,没有做任何学习笔记以及开发经验的总结等。后来觉得网上关于SDL的资源比较少,所以小编决定等以后有时间把自己...
1 2 3 4 5 ... 20
收藏数 26,473
精华内容 10,589
关键字:

sdl