RTSP流媒体播放器实现

本文介绍了如何利用ffmpeg库实现一个简单的RTSP流媒体播放器,该播放器支持播放、停止和暂停功能。目前仅测试了H264格式的视频,存在本地播放与原始视频不同步的问题。此外,提到了VLC库作为替代方案,可以方便地开发流媒体播放器。
摘要由CSDN通过智能技术生成

        最近需要做一个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
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值