资源简介

本工程包含了使用各种API(Direct3D,OpenGL,GDI,DirectSound,SDL2)播放多媒体例子。 其中音频输入为PCM采样数据。输出至系统的声卡播放出来。 视频输入为YUV/RGB像素数据。输出至显示器上的一个窗口播放出来。 通过本工程的代码初学者可以快速学习使用这几个API播放视频和音频的技术。 一共包括了如下几个子工程: simplest_audio_play_directsound: 使用DirectSound播放PCM音频采样数据。 simplest_audio_play_sdl2: 使用SDL2播放PCM音频采样数据。 simplest_video_play_direct3d: 使用Direct3D的Surface播放RGB/YUV视频像素数据。 simplest_video_play_direct3d_texture:使用Direct3D的Texture播放RGB视频像素数据。 simplest_video_play_gdi: 使用GDI播放RGB/YUV视频像素数据。 simplest_video_play_opengl: 使用OpenGL播放RGB/YUV视频像素数据。 simplest_video_play_opengl_texture: 使用OpenGL的Texture播放YUV视频像素数据。 simplest_video_play_sdl2: 使用SDL2播放RGB/YUV视频像素数据。 1.1版修复了一些问题

资源截图

代码片段和文件信息

/**
 * 最简单的DirectSound播放音频的例子(DirectSound播放PCM)
 * Simplest Audio Play DirectSound (DirectSound play PCM) 
 *
 * 雷霄骅 Lei Xiaohua
 * leixiaohua1020@126.com
 * 中国传媒大学/数字电视技术
 * Communication University of China / Digital TV Technology
 * http://blog.csdn.net/leixiaohua1020
 *
 * 本程序使用DirectSound播放PCM音频采样数据。
 * 是最简单的DirectSound播放音频的教程。
 *
 * 函数调用步骤如下: 
 *
 * [初始化]
 * DirectSoundCreate8(): 创建一个DirectSound对象。
 * SetCooperativeLevel(): 设置协作权限,不然没有声音。
 * IDirectSound8->CreateSoundBuffer(): 创建一个主缓冲区对象。
 * IDirectSoundBuffer->QueryInterface(IID_IDirectSoundBuffer8..): 
 * 创建一个副缓冲区对象,用来存储要播放的声音数据文件。
 * IDirectSoundBuffer8->QueryInterface(IID_IDirectSoundNotify..): 
 * 创建通知对象,通知应用程序指定播放位置已经达到。
 * IDirectSoundNotify8->SetNotificationPositions(): 设置通知位置。
 * IDirectSoundBuffer8->SetCurrentPosition(): 设置播放的起始点。
 * IDirectSoundBuffer8->Play(): 开始播放。
 *
 * [循环播放数据]
 * IDirectSoundBuffer8->Lock(): 锁定副缓冲区,准备写入数据。
 * fread(): 读取数据。
 * IDirectSoundBuffer8->Unlock(): 解锁副缓冲区。
 * WaitForMultipleobjects(): 等待“播放位置已经达到”的通知。
 *
 * This software plays PCM raw audio data using DirectSound.
 * It‘s the simplest tutorial about DirectSound.
 *
 * The process is shown as follows:
 *
 * [Init]
 * DirectSoundCreate8(): Init DirectSound object.
 * SetCooperativeLevel(): Must set or we won‘t hear sound.
 * IDirectSound8->CreateSoundBuffer(): Create primary sound buffer.
 * IDirectSoundBuffer->QueryInterface(IID_IDirectSoundBuffer8..): 
 * Create secondary sound buffer.
 * IDirectSoundBuffer8->QueryInterface(IID_IDirectSoundNotify..): 
 * Create Notification object.
 * IDirectSoundNotify8->SetNotificationPositions():
 * Set Notification Positions.
 * IDirectSoundBuffer8->SetCurrentPosition(): Set position to start.
 * IDirectSoundBuffer8->Play(): Begin to play.
 *
 * [Loop to play data]
 * IDirectSoundBuffer8->Lock(): Lock secondary buffer.
 * fread(): get PCM data.
 * IDirectSoundBuffer8->Unlock(): UnLock secondary buffer.
 * WaitForMultipleobjects(): Wait for Notifications.
 */
#include 
#include 
#include 
#include 


#define MAX_AUDIO_BUF 4 
#define BUFFERNOTIFYSIZE 192000 


int sample_rate=44100; //PCM sample rate
int channels=2; //PCM channel number
int bits_per_sample=16; //bits per sample

BOOL main(int argcchar * argv[])
{
int i;
FILE * fp;
if((fp=fopen(“../NocturneNo2inEflat_44.1k_s16le.pcm““rb“))==NULL){
printf(“cannot open this file\n“);
return -1;
}

IDirectSound8 *m_pDS=NULL;
IDirectSoundBuffer8 *m_pDSBuffer8=NULL; //used to manage sound buffers.
IDirectSoundBuffer *m_pDSBuffer=NULL;
IDirectSoundNotify8 *m_pDSNotify=NULL;
DSBPOSITIONNOTIFY m_pDSPosNotify[MAX_AUDIO_BUF];
HANDLE m_event[MAX_AUDIO_BUF];

SetConsoletitle(TEXT(“Simplest Audio Play DirectSound“));//Console title
//Init DirectSound
if(FAILED(DirectSoundCreate8(NULL&m_pDSNULL)))
return FALSE;
if(FAILED(m_pDS->SetCooperativeLevel(FindWind

评论

共有 条评论