winAPI+ffmpeg音频播放

本文介绍了如何结合winmm库和ffmpeg框架来实现音频的播放功能,主要聚焦于在Windows平台上利用winmm API进行音频输出,并整合ffmpeg进行音频处理。
摘要由CSDN通过智能技术生成

winmm+ffmpeg音频播放

     前面有篇ffmpeg+gdi播放视频,因为内容比较简单,就直接贴了代码,本章使用winmm+ffmpeg实现音频播放,学习ffmpeg的api的使用需要一定的耐心,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,实际使用中最好通过下载源码的方式编译裁剪后使用。
    音频播放必须得使用缓冲,也就是预先准备好几段音频WAVE数据,待将音频数据复制到音频播放设备缓冲队列后也就是我们得到音频回调函数中WOM_DONE消息之后将后面的数据继续送入音频播放缓冲队列中,下面请耐心查看代码。

//gdiplay.cpp: 定义应用程序的入口点。
//

#include "stdafx.h"
#include "audioplay.h"
#include <atlstr.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

extern "C" {
#include "libavcodec\avcodec.h"  
#include "libavformat\avformat.h"  
#include "libavutil\channel_layout.h"  
#include "libavutil\common.h"  
#include "libavutil\imgutils.h"  
#include "libswscale\swscale.h" 
#include "libavutil\imgutils.h"      
#include "libavutil\opt.h"         
#include "libavutil\mathematics.h"      
#include "libavutil\samplefmt.h"
#include "libavutil\timestamp.h"
#include "libavutil\log.h"
#include "libavutil\time.h"
#include "libswresample\swresample.h" 
}

#define MAX_LOADSTRING 100

BOOL bOffThreadFlag = FALSE;		//是否关闭当前的播放视频的线程

// 全局变量: 
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名

// 此代码模块中包含的函数的前向声明: 
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

HWND m_hWnd;

struct 	tagMediaParam
{
	AVFormatContext *pFormatCtx;
	AVCodecContext  *pCodecCtx;
	AVCodec         *pCodec;
	int              audioindex;
	SwsContext      *img_convert_ctx;
	HANDLE           thread;
};

tagMediaParam mParam;

CString GetFilePath(HWND* phWnd)
{
	OPENFILENAME ofn;      // 公共对话框结构。    
	TCHAR szFile[MAX_PATH]; // 保存获取文件名称的缓冲区。              
    
	ZeroMemory(&ofn, sizeof(ofn));
	ofn.lStructSize = sizeof(ofn);
	ofn.hwndOwner = *phWnd;
	ofn.lpstrFile = szFile;
	//    
	//    
	ofn.lpstrFile[0] = _T('\0');
	ofn.nMaxFile = sizeof(szFile);
	ofn.lpstrFilter = _T("音频(*.*)\0*.*\0\0");
	ofn.nFilterIndex = 1;
	ofn.lpstrFileTitle = NULL;
	ofn.nMaxFileTitle = 0;
	ofn.lpstrInitialDir = NULL;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
	ofn.lpstrFileTitle = (LPTSTR)_T("打开");
	// 显示打开
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值