PlaySound的同步播放与异步播放

Posted sanqima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PlaySound的同步播放与异步播放相关的知识,希望对你有一定的参考价值。

    PlaySound是Windows平台独有的API函数,仅支持.wav格式的音频文件播放,使用的库文件为winmm.lib,该库文件是Windows自带的库文件,只需要申明即可,不需要手动添加。

  • 声明如下:
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")
  • 它分为同步方式、异步方式2种。
  • 1)同步方式
//1) MBCS编码
PlaySound("hello.wav", NULL, SND_SYNC | SND_FILENAME | SND_NOSTOP);

//2) Unicode编码
PlaySound(L"hello.wav", NULL, SND_SYNC | SND_FILENAME | SND_NOSTOP);

//3) 兼容MBCS编码与Unicode编码
PlaySound(TEXT("hello.wav"), NULL, SND_SYNC | SND_FILENAME | SND_NOSTOP);
  • 2)异步方式
//1) MBCS编码
PlaySound("hello.wav", NULL, SND_ASYNC | SND_FILENAME | SND_NOSTOP);

//2) Unicode编码
PlaySound(L"hello.wav", NULL, SND_ASYNC | SND_FILENAME | SND_NOSTOP);

//3) 兼容MBCS编码与Unicode编码
PlaySound(TEXT("hello.wav"), NULL, SND_ASYNC | SND_FILENAME | SND_NOSTOP);

    这里以一个控制台应用程序DoPlay为例来进行说明,使用的开发工具为 Visual Studio 2005
    点击Visual Studio工具栏的[File] --》新建 --》Visual C++ —》Win32 --》Win32控制台应用程序 --》名称:DoPaly

1 同步播放sync

1.1 使用多字节字符集(MBCS)编码

    //DoPlay.cpp

#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound("hello.wav", NULL, SND_SYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

1.2 使用Unicode字符集编码

    //DoPlay.cpp

#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound(L"hello.wav", NULL, SND_SYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

1.3 兼容MBCS与Unicode

    //DoPlay.cpp

#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound(TEXT("hello.wav"), NULL, SND_SYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

2 异步播放Async

2.1 使用多字节字符集(MBCS)编码

    //DoPlay.cpp

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound("hello.wav", NULL,SND_ASYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

2.2 使用Unicode字符集编码

    //DoPlay.cpp

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound(L"hello.wav", NULL,SND_ASYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

2.3 兼容MBCS与Unicode

    //DoPlay.cpp

#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    PlaySound(TEXT("hello.wav"), NULL, SND_ASYNC |SND_FILENAME | SND_NOSTOP);
    system("pause");
    return 0;

3 附录

  • 由于PlaySound()函数仅支持.wav格式的音频文件播放,支持的格式种类太单一。
  • 若要支持mp3、ogg、flac、oga、ac3、aac、wav等音频文件的播放,请使用mciSendString()函数
函数音频格式
PlaySound()仅支持.wav音频格式
mciSendString()支持mp3、ogg、flac、oga、ac3、aac、wavc等音频格式

   

  1. mciSendString的函数声明如下:
BOOL mciSendString(“Command1 FILE Command2”,NULL,0,NULL);

形参“Command1 FILE Command2”里的3个变量是逻辑&&与的关系,其可能的组合如下:

  • “Command1 FILE”
  • “Command1 FILE Command2”

   
2) mciSendString函数需要的头文件如下:

#include<windows.h>
#pragma comment(lib,"winmm.lib")

3.1 播放一次

    //DoMusic.cpp

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    mciSendString(TEXT("play .\\\\World.mp3"), NULL, 0, NULL);
    system("pause");
    return 0;

3.2 重复播放

    //DoMusic.cpp

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    mciSendString(TEXT("play .\\\\World.mp3 repeat"), NULL, 0, NULL);
    system("pause");
    return 0;

3.3 结束播放

    //DoMusic.cpp

#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

int main()

    mciSendString(TEXT("close .\\\\World.mp3 repeat"), NULL, 0, NULL);
    system("pause");
    return 0;

以上是关于PlaySound的同步播放与异步播放的主要内容,如果未能解决你的问题,请参考以下文章

PlaySound的同步播放与异步播放

如何异步使用playsound?

PlaySound 无法播放两个异步声音

Python编程实例-播放音频汇总(Linux环境)

解决Python使用playsound播放音频报错:在用引号括起的字符串不能指定额外的字符

使用ffmpeg实现单线程异步的视频播放器