最近需要做一个RTSP流媒体播放器,研究了一下,封装了一个RTSP播放类CRTSPPlayer,解码库采用ffmpeg。由于需求比较简单,时间也有限,目前只实现了播放、停止、暂停几个基本的接口。下面是基于CRTSPPlayer类实现的简单RTSP播放器。
目前视频只测试了H264格式,其它格式的视频还未做测试。播放器也支持直接打开本地视频播放,但播放的帧率和原始视频的码率不同步。目前还不清楚如何处理这个问题,希望懂这方面的大侠指教。
另外,还有一个开源的库VLC也可以用来开发流媒体播放器,它支持多种流媒体协议,如RTP、RTSP等,CodeProject上已经有牛人在VLCLib的基础上封装可更易使用的库VLCWrapper(地址:http://www.codeproject.com/Articles/38952/VLCWrapper-A-Little-C-wrapper-Around-libvlc)。用它可以很方便的开发视频播放器。
以下是CRTSPPlayer完整的代码:
头文件:
/********************************************************************
filename: CRTSPPlayer.h
created: 2013-03-25
author: firehood
purpose: ffmpeg库实现的RTSP视频播放器
*********************************************************************/
#pragma once
#include "windows.h"
extern "C"
{
#include "libavformat\avformat.h"
#include "libavcodec\avcodec.h"
#include "libswscale\swscale.h"
};
// 播放状态
enum RTSP_PLAYSTATUS
{
RTSP_PLAYSTATUS_NONE, // 未知状态(未播放)
RTSP_PLAYSTATUS_PLAYING, // 正在播放
RTSP_PLAYSTATUS_PAUSE, // 已暂停
RTSP_PLAYSTATUS_STOP, // 已停止
};
class CRTSPPlayer
{
public:
CRTSPPlayer(HWND hWnd, LPRECT lpRect);
~CRTSPPlayer(void);
public:
// 打开媒体文件
BOOL OpenMedia(LPCTSTR pFileName);
// 播放
void Play();
// 暂停
void Pause();
// 停止
void Stop();
// 获取播放状态
RTSP_PLAYSTATUS GetPlayStatus(void);
private:
// 解码初始化
int DecodeInit(LPCTSTR pFileName);
// 卸载
void DecodeUninit();
// 开始解码线程
BOOL StartDecodeThread();
// 停止解码线程
void StopDecodeThread();
// 解码线程
static int WINAPI ThreadDecodeVideo(LPVOID lpParam);
// 开始解码任务
int BeginDecode();
// 显示
void Display();
// 图像转换
int ImgConvert(AVPicture * dst, PixelFormat dstFormt, const AVPicture * src, PixelFormat srcFormt, int src_width, int src_height);
// 设置播放状态
void SetPlayStatus(RTSP_PLAYSTATUS playStatus);
private:
HANDLE m_hDecodeThread;
BOOL m_bExitDecodeThread;
TCHAR m_strFilePath[MAX_PATH];
AVFormatContext* m_pFormatContext;
AVCodecContext* m_pCodecContext;
AVCodec* m_pCodec;
AVPacket m_struPacket;
int m_nStreamIndex;
AVFrame