摘抄雷兄

http://blog.csdn.net/leixiaohua1020/article/details/46890259

/**
* 最简单的SDL2播放音频的例子(SDL2播放PCM)
* Simplest Audio Play SDL2 (SDL2 play PCM)
*
* 雷霄骅 Lei Xiaohua
* leixiaohua1020@126.com
* 中国传媒大学/数字电视技术
* Communication University of China / Digital TV Technology
* http://blog.csdn.net/leixiaohua1020
*
* 本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图
* API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层
* API。
*
* 函数调用步骤如下:
*
* [初始化]
* SDL_Init(): 初始化SDL。
* SDL_OpenAudio(): 根据参数(存储于SDL_AudioSpec)打开音频设备。
* SDL_PauseAudio(): 播放音频数据。
*
* [循环播放数据]
* SDL_Delay(): 延时等待播放完成。
*
* This software plays PCM raw audio data using SDL2.
* SDL is a wrapper of low-level API (DirectSound).
* Use SDL is much easier than directly call these low-level API.
*
* The process is shown as follows:
*
* [Init]
* SDL_Init(): Init SDL.
* SDL_OpenAudio(): Opens the audio device with the desired
* parameters (In SDL_AudioSpec).
* SDL_PauseAudio(): Play Audio.
*
* [Loop to play data]
* SDL_Delay(): Wait for completetion of playback.
*/ #include <stdio.h>
#include "SDL2/SDL.h" //Buffer:
//|-----------|-------------|
//chunk-------pos---len-----|
static unsigned char *audio_chunk;
static unsigned int audio_len;
static unsigned char *audio_pos; /* Audio Callback
* 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,unsigned char *stream,int len){
//SDL 2.0
SDL_memset(stream, , len);
if(audio_len==) /* 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[])
{
//Init
if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
printf( "Could not initialize SDL - %s\n", SDL_GetError());
return -;
}
//SDL_AudioSpec
SDL_AudioSpec wanted_spec;
wanted_spec.freq = ;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.channels = ;
wanted_spec.silence = ;
wanted_spec.samples = ;
wanted_spec.callback = fill_audio; if (SDL_OpenAudio(&wanted_spec, NULL)<){
printf("can't open audio.\n");
return -;
} FILE *fp=fopen("audio_play_48K.pcm","rb+");
if(fp==NULL){
printf("cannot open this file\n");
return -;
} int pcm_buffer_size=;
char *pcm_buffer=(char *)malloc(pcm_buffer_size);
int data_count=; //Play
SDL_PauseAudio(); while(){
if (fread(pcm_buffer, , pcm_buffer_size, fp) != pcm_buffer_size){
// Loop
fseek(fp, , SEEK_SET);
fread(pcm_buffer, , pcm_buffer_size, fp);
data_count=;
}
printf("Now Playing %10d Bytes data.\n",data_count);
data_count+=pcm_buffer_size;
//Set audio buffer (PCM data)
audio_chunk = (unsigned char*) pcm_buffer;
//Audio buffer length
audio_len =pcm_buffer_size;
audio_pos = audio_chunk; while(audio_len>)//Wait until finish
SDL_Delay();
}
free(pcm_buffer);
SDL_Quit();
return ;
}

一、环境搭建

(1)安装sdl

http://www.cnblogs.com/chencesc/p/5759850.html

在安装前为了能在 ubuntu pc上播放 sudo apt-get install libasound2-dev

然后在编译sdl2.0是configure支持pc设备驱动

(2)安装ffmpeg

各版本下载

https://github.com/FFmpeg/FFmpeg/tree/n2.5.2

下载源码编译安装

一、编译运行

 

  #Makefile

   GCC=gcc # GCC编译器命令
OUTPUT=a.out
CFLAGS=-g # 程序优化选项
LDFLAGS=-lSDL2main -lSDL2 -lavformat -lavcodec -lavutil -lswscale -lswresample -lm -lpthread -lz -llzma# 链接库
EXEC=sdl_audio.c# 程序的名字,由你决定 all: ${EXEC}
${GCC} $(CFLAGS) -o ${OUTPUT} ${EXEC} ${LDFLAGS}
clean:
rm -rf ${OUTPUT}

运行要注意linux用pc播放需要以下代码

SDL_AUDIODRIVER=alsa ./a.out

播放效果不错哦

ffplay代码播放pcm数据的更多相关文章

  1. FFMPEG学习----使用SDL播放PCM数据

    参考雷神的代码: /** * 最简单的SDL2播放音频的例子(SDL2播放PCM) * Simplest Audio Play SDL2 (SDL2 play PCM) * * 本程序使用SDL2播放 ...

  2. 使用 audioqueue 播放PCM数据

    // // MainViewController.h // RawAudioDataPlayer // // Created by SamYou on 12-8-18. // Copyright (c ...

  3. Android OpenSL ES 开发:使用 OpenSL 播放 PCM 数据

    OpenSL ES 是基于NDK也就是c语言的底层开发音频的公开API,通过使用它能够做到标准化, 高性能,低响应时间的音频功能实现方法. 这次是使用OpenSL ES来做一个音乐播放器,它能够播放m ...

  4. DirectSound播放PCM(可播放实时采集的音频数据)

    前言 该篇整理的原始来源为http://blog.csdn.net/leixiaohua1020/article/details/40540147.非常感谢该博主的无私奉献,写了不少关于不同多媒体库的 ...

  5. 使用AudioTrack播放PCM音频数据(android)

    众所周知,Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的.MediaPl ...

  6. 音频 PCM 数据的采集和播放

    PCM(Pulse Code Modulation)脉冲编码调制 —— 音频的采集与量化过程. PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大. 为了解决这个问题先后诞生了 ...

  7. 最简单的视音频播放示例9:SDL2播放PCM

    本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  8. 最简单的视音频播放示例8:DirectSound播放PCM

    本文记录DirectSound播放音频的技术.DirectSound是Windows下最常见的音频播放技术.目前大部分的音频播放应用都是通过DirectSound来播放的.本文记录一个使用Direct ...

  9. 最简单的视音频播放演示样例8:DirectSound播放PCM

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

随机推荐

  1. [NHibernate]HQL查询

    目录 写在前面 文档与系列文章 查询的几种方式 HQL查询 一个例子 总结 写在前面 上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这 ...

  2. 【阿里李战】解剖JavaScript中的 null 和 undefined

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  3. haproxy测试

    环境: Clients:N台linux, 使用“ab -k -c 20000...” 并发2w 请求haproxy Haproxy Server: R610 2*8核 2.4G Real Server ...

  4. js函数中this的不同含义

    1.js函数调用过程中,js线程会进入新的执行环境并创建该环境的变量对象,并添加两个变量:this和arguments,因此可以在函数中使用这两个变量.需要注意的是,this变量不能重新赋值,而arg ...

  5. WebService的创建发布及部署

    1.打开win7的IIS功能: http://jingyan.baidu.com/article/2a138328ae4b85074b134f55.html 2.IIS注册Frameworkt4.0 ...

  6. request response

    request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的.     接受请求指的就是request对象     完成响应指的就 ...

  7. SQL Server服务器上需要导入Excel数据的必要条件

    SQL Server服务器上需要导入Excel数据,必须安装2007 Office system 驱动程序:数据连接组件,或者Access2010的数据库引擎可再发行程序包,这样就不必在服务器上装Ex ...

  8. VC++ 一个简单的Log类

    在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...

  9. LeetCode 219 Contains Duplicate II

    Problem: Given an array of integers and an integer k, find out whether there are two distinct indice ...

  10. 配置https

    引子: 最近在一篇文章中了解到EFF(电子前哨基金会)为了推广https协议,成立了一个let'sencrypt项目,可以发放免费的证书,此证书可以被大多数主流浏览器所信任,这个邪恶的念头一爆发,就让 ...