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