SDL实现简单h264文件的播放

本文介绍了如何利用SDL库在不同平台上播放h264文件。首先,介绍了SDL的重要性及其跨平台特性。接着,提供了SDL相关文件的下载链接,并强调SDL 1.2与2.0的区别。在VS2010环境下,通过MFC进行显示,并展示了关键代码,包括使用ffmpeg解码h264文件,调用sws_scale进行YUV到RGB的色彩空间转换,最后通过SDL显示。同时提到了bmp保存时对RGB格式的处理。
摘要由CSDN通过智能技术生成

对于播放库的选择,有SDL,Directx,DirectShow,OpenGL,GDI等,区别可以百度搜搜;
SDL意味着可以跨平台,这点很重要,因为我所在的环境,更多的可以考虑夸平台,所以选择SDL,SDL简介具体可以看下面的链接http://blog.csdn.net/nightmare/article/details/7457
一:下载SDL相关文件
http://www.libsdl.org/download-1.2.php
注意:SDL 1.2和 SDL 2.0是有区别的,具体请查看
http://blog.csdn.net/lanxiaziyi/article/details/24938981
二:VS2010添加相关文件,具体根据编译环境来操作;
三:我使用的是MFC进行显示,代码如下:

#include "stdafx.h"
#include "SDL_264Show.h"
#include "SDL_264ShowDlg.h"
#include "afxdialogex.h"

extern "C" {
#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_Video.h"
}

extern "C"{
#include <libavcodec/avcodec.h>  
#include <libavformat/avformat.h>  
#include <libswscale/swscale.h> 
#include <libavutil/mem.h>
};


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable);

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// 对话框数据
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CSDL_264ShowDlg 对话框




CSDL_264ShowDlg::CSDL_264ShowDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CSDL_264ShowDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSDL_264ShowDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSDL_264ShowDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CSDL_264ShowDlg::OnBnPlay)
END_MESSAGE_MAP()


// CSDL_264ShowDlg 消息处理程序

BOOL CSDL_264ShowDlg::OnInitDialog()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt和SDL是两种不同的程序库,均可用于实现音频播放。下面分别介绍一下在这两种程序库中实现音频播放的方法: Qt通过QMediaPlayer类来实现音频播放。QMediaPlayer类是Qt Multimedia模块的一部分,它可以播放各种媒体文件,包括音频和视频。在使用QMediaPlayer类时,需要先创建一个QMediaPlayer对象,然后调用setMedia方法设置音频文件的路径,最后调用play方法来开始播放音频文件。例如,以下代码可以播放一个MP3文件: ```c++ #include <QtMultimedia/QMediaPlayer> int main(int argc, char *argv[]) { QMediaPlayer player; player.setMedia(QUrl::fromLocalFile("/path/to/file.mp3")); player.play(); return 0; } ``` SDL也提供了音频播放功能。具体来说,可以通过SDL的音频子系统来实现。在使用SDL的音频子系统时,需要先调用SDL_Init函数初始化音频子系统,然后设置音频参数,注册回调函数,最后在回调函数中处理音频数据。以下是一个简单的示例代码,可以播放WAV文件: ```c #include <SDL2/SDL.h> // 回调函数,用于处理音频数据 void audio_callback(void *userdata, Uint8 *stream, int len) { static Uint32 pos = 0; // 当前播放位置 SDL_memcpy(stream, userdata + pos, len); pos += len; } int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_AUDIO); SDL_AudioSpec wav_spec; Uint8 *wav_data; Uint32 wav_length; // 加载WAV文件 SDL_LoadWAV("/path/to/file.wav", &wav_spec, &wav_data, &wav_length); // 设置音频参数 SDL_AudioSpec want, have; SDL_memset(&want, 0, sizeof(want)); want.freq = wav_spec.freq; want.format = AUDIO_S16SYS; want.channels = wav_spec.channels; want.samples = 1024; want.callback = audio_callback; want.userdata = wav_data; // 打开音频设备并开始播放 SDL_OpenAudio(&want, &have); SDL_PauseAudio(0); // 等待音频播放结束 SDL_Delay(wav_length/wav_spec.freq*1000); // 关闭音频设备和释放资源 SDL_CloseAudio(); SDL_FreeWAV(wav_data); return 0; } ``` 综上所述,无论是Qt还是SDL都可以实现音频播放。要根据具体情况选择适合自己的程序库和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值