rtsp流媒体服务器论坛 求rtsp流媒体服务器播放网址

Android VideoView如何播放RTSP的流_小组_ThinkSAAS
Android VideoView如何播放RTSP的流
Android VideoView如何播放RTSP的流
目前在做视频应用的时候,比较先进的技术就是RTSP流媒体了,那么如和利用Android的播放控件VideoView来播放RTSP的流呢?
RTSP流媒体链接:
这个链接含有所有的RTSP流媒体的链接,现在咱们就用VideoView来播放里面的RTSP的流,咱们以其中的一个链接来测试下好了:
rtsp://218.204.223.237:554/live/1/691F/e7ooqwcfbqjoo80j.sdp.
核心代码如下:
package com.video.
import android.app.A
import android.net.U
import android.os.B
import android.view.V
import android.widget.B
import android.widget.EditT
import android.widget.VideoV
public class rtspActivity extends Activity {
/** Called when the activity is first created. */
Button playB
VideoView videoV
EditText rtspU
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
rtspUrl = (EditText)this.findViewById(R.id.url);
playButton = (Button)this.findViewById(R.id.start_play);
playButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
PlayRtspStream(rtspUrl.getEditableText().toString());
videoView = (VideoView)this.findViewById(R.id.rtsp_player);
//play rtsp stream
private void PlayRtspStream(String rtspUrl){
videoView.setVideoURI(Uri.parse(rtspUrl));
videoView.requestFocus();
videoView.start();
在点击开始播放后,一般要等个10几秒中才开始播放的,直接的设置需要播放的RTSP的地址:setVideoURI(rtsp的地址)
转自:http://www.shouyanwang.org/thread-96-1-1.html
下载次数: 725
浏览 11302
用户评论(0)
开发技术学习小组列表
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。
iphone扫码下载客户端当前位置: >
> RTSP流媒体播放器兑现
RTSP流媒体播放器兑现
hehedeai8000 & at
RTSP流媒体播放器实现  最近需要做一个RTSP流媒体播放器,研究了一下,封装了一个RTSP播放类CRTSPPlayer,解码库采用ffmpeg。由于需求比较简单,时间也有限,目前只实现了播放、停止、暂停几个基本的接口。下面是基于CRTSPPlayer类实现的简单RTSP播放器。
  目前视频只测试了H264格式,其它格式的视频还未做测试。播放器也支持直接打开本地视频播放,但播放的帧率和原始视频的码率不同步。目前还不清楚如何处理这个问题,希望懂这方面的大侠指教。
  另外,还有一个开源的库VLC也可以用来开发流媒体播放器,它支持多种流媒体协议,如RTP、RTSP等,CodeProject上已经有牛人在VLCLib的基础上封装可更易使用的库VLCWrapper(地址:)。用它可以很方便的开发视频播放器。
  以下是CRTSPPlayer完整的代码:
  头文件:
  /********************************************************************
CRTSPPlayer.h
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
CRTSPPlayer(HWND hWnd, LPRECT lpRect);
~CRTSPPlayer(void);
// 打开媒体文件
BOOL OpenMedia(LPCTSTR pFileName);
void Play();
void Pause();
void Stop();
// 获取播放状态
RTSP_PLAYSTATUS GetPlayStatus(void);
// 解码初始化
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);
m_hDecodeT
m_bExitDecodeT
m_strFilePath[MAX_PATH];
AVFormatContext* m_pFormatC
AVCodecContext*
AVCodec* m_pC
AVPacket m_struP
int m_nStreamI
AVFrame* m_pFrameYUV;
AVFrame* m_pFrameRGB;
m_pBufRGB;
// 解码后的RGB数据
RTSP_PLAYSTATUS
  源文件:
  /********************************************************************
CRTSPPlayer.cpp
ffmpeg库实现的RTSP视频播放器
*********************************************************************/
#include &StdAfx.h&
#include &RTSPPlayer.h&
#pragma comment(lib, &avformat.lib&)
#pragma comment(lib, &avcodec.lib&)
#pragma comment(lib, &swscale.lib&)
#pragma comment(lib, &avutil.lib&)
#define SHOW_TITLE
const char* WcharToUtf8(const wchar_t *pwStr)
if (pwStr == NULL)
return NULL;
int len = WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, NULL, 0, NULL, NULL);
if (len &= 0)
return NULL;
char *pStr = new char[len];
WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, pStr, len, NULL, NULL);
CRTSPPlayer::CRTSPPlayer(HWND hWnd, LPRECT lpRect):
m_hWnd(hWnd),
m_rcWnd(*lpRect),
m_hDecodeThread(NULL),
m_bExitDecodeThread(FALSE),
m_nFrameWidth(0),
m_nFrameHeight(0),
m_pFormatContext(NULL),
m_pCodecContext(NULL),
m_pCodec(NULL),
m_nStreamIndex(-1),
m_pFrameYUV(NULL),
m_pFrameRGB(NULL),
m_pBufRGB(NULL),
m_nPlayStatus(RTSP_PLAYSTATUS_NONE)
memset(m_strFilePath,0,sizeof(m_strFilePath));
CRTSPPlayer::~CRTSPPlayer(void)
DecodeUninit();
// 打开媒体文件
BOOL CRTSPPlayer::OpenMedia(LPCTSTR pFileName)
if(pFileName == NULL)
return FALSE;
DecodeUninit();
memcpy(m_strFilePath,pFileName,sizeof(m_strFilePath));
DecodeInit(m_strFilePath);
return TRUE;
void CRTSPPlayer::Play()
if(GetPlayStatus() == RTSP_PLAYSTATUS_STOP)
DecodeInit(m_strFilePath);
BOOL bRet = StartDecodeThread();
SetPlayStatus(RTSP_PLAYSTATUS_PLAYING);
void CRTSPPlayer::Pause()
StopDecodeThread();
SetPlayStatus(RTSP_PLAYSTATUS_PAUSE);
void CRTSPPlayer::Stop()
StopDecodeThread();
DecodeUninit();
SetPlayStatus(RTSP_PLAYSTATUS_STOP);
BOOL CRTSPPlayer::StartDecodeThread()
if(m_hDecodeThread == NULL)
m_hDecodeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadDecodeVideo, this, 0, NULL);
return m_hDecodeThread
TRUE : FALSE;
void CRTSPPlayer::StopDecodeThread()
if(m_hDecodeThread)
m_bExitDecodeThread = TRUE;
WaitForSingleObject(m_hDecodeThread,INFINITE);
CloseHandle(m_hDecodeThread);
m_hDecodeThread = NULL;
int CRTSPPlayer::ImgConvert(AVPicture * dst, PixelFormat dst_pix_fmt, const AVPicture * src, PixelFormat src_pix_fmt, int src_width, int src_height)
unsigned char * srcSlice[4];
int srcStride[4] = {0};
unsigned char * dstSlice[4];
int dstStride[4] = {0};
for (int i=0; i&4; i++)
srcSlice[i] = src-&data[i];
srcStride[i] = src-&linesize[i];
dstSlice[i] = dst-&data[i];
dstStride[i] = dst-&linesize[i];
SwsContext *pSwsContext = sws_getContext(src_width, src_height, src_pix_fmt, src_width, src_height, dst_pix_fmt, SWS_BICUBIC, NULL, NULL, NULL);
int nRet = sws_scale(pSwsContext, srcSlice, srcStride, 0, src_height, dstSlice, dstStride);
if (pSwsContext != NULL)
sws_freeContext(pSwsContext);
int WINAPI CRTSPPlayer::ThreadDecodeVideo(LPVOID lpParam)
CRTSPPlayer *pPlayer = (CRTSPPlayer*)lpP
pPlayer-&BeginDecode();
int CRTSPPlayer::DecodeInit(LPCTSTR pFileName)
if(pFileName == NULL)
return -1;
av_register_all();
const char *filePath = WcharToUtf8(pFileName);
// Open video
if (av_open_input_file(&m_pFormatContext, filePath, NULL, 0, NULL) != 0)
return -2; // Couldn't open file
delete[] fileP
// Open video
if (av_open_input_file(&m_pFormatContext, pFileName, NULL, 0, NULL) != 0)
return -2; // Couldn't open file
// Retrieve stream information
if (av_find_stream_info(m_pFormatContext) & 0)
return -3; // Couldn't find stream information
// Find the first video stream
for (UINT i=0; i&m_pFormatContext-&nb_ i++)
if (m_pFormatContext-&streams[i]-&codec-&codec_type == CODEC_TYPE_VIDEO)
m_nStreamIndex =
if (m_nStreamIndex == -1)
return -4; // Didn't find a video stream
// Get a pointer to the codec context for the video stream
m_pCodecContext = m_pFormatContext-&streams[m_nStreamIndex]-&
// Find the decoder for the video stream
m_pCodec = avcodec_find_decoder(m_pCodecContext-&codec_id);
if (m_pCodec == NULL)
return -5 ; // Codec not found
// Inform the codec that we can handle truncated bitstreams -- i.e.,
// bitstreams where frame boundaries can fall in the middle of packets
if (m_pCodec-&capabilities & CODEC_CAP_TRUNCATED)
m_pCodecContext-&flags |= CODEC_FLAG_TRUNCATED;
// we do not send complete frames
// Open codec
if (avcodec_open(m_pCodecContext, m_pCodec) & 0)
return -6; // Could not open codec
// Allocate video frame
m_pFrameYUV = avcodec_alloc_frame();
// Allocate an AVFrame structure
m_pFrameRGB = avcodec_alloc_frame();
// Determine required buffer size and allocate buffer
int numBytes = avpicture_get_size(PIX_FMT_BGR24, m_pCodecContext-&width, m_pCodecContext-&height);
m_pBufRGB = new BYTE [numBytes];
memset(m_pBufRGB,0,numBytes);
// Assign appropriate parts of buffer to image planes in m_pFrameRGB
avpicture_fill((AVPicture *)m_pFrameRGB, m_pBufRGB, PIX_FMT_BGR24, m_pCodecContext-&width, m_pCodecContext-&height);
m_nFrameWidth
= m_pCodecContext-&
m_nFrameHeight = m_pCodecContext-&
void CRTSPPlayer::DecodeUninit()
// Close the codec
if (m_pCodecContext)
avcodec_close(m_pCodecContext);
//av_free(m_pCodec);
m_pCodecContext = NULL;
m_pCodec = NULL;
// Close the video file
if (m_pFormatContext)
av_close_input_file(m_pFormatContext);
m_pFormatContext = NULL;
if (m_pFrameYUV)
av_free(m_pFrameYUV);
m_pFrameYUV = NULL;
if (m_pFrameRGB)
av_free(m_pFrameRGB);
m_pFrameRGB = NULL;
if (m_pBufRGB)
delete [] m_pBufRGB;
m_pBufRGB = NULL;
int CRTSPPlayer::BeginDecode()
int bytesRemaining = 0, bytesD
BYTE * rawData = NULL;
int frameFinished = 0;
m_struPacket.data = NULL;
m_struPacket.size = 0;
m_bExitDecodeThread = FALSE;
while (!m_bExitDecodeThread && m_pFormatContext)
// Read the next packet, skipping all packets that aren't for this stream
// Read new packet
if (av_read_frame(m_pFormatContext, &m_struPacket) & 0)
return -2;
} while (m_struPacket.stream_index != m_nStreamIndex);
bytesRemaining = m_struPacket.
rawData = m_struPacket.
// Work on the current packet until we have decoded all of it
while (bytesRemaining & 0)
// Decode the next chunk of data
bytesDecoded = avcodec_decode_video(m_pCodecContext, m_pFrameYUV, &frameFinished, rawData, bytesRemaining);
// Was there an error
if (bytesDecoded & 0)
return -1;
bytesRemaining -= bytesD
rawData += bytesD
// Did we finish the current frame
Then we can return
if (frameFinished)
ImgConvert(
(AVPicture *)m_pFrameRGB,
PIX_FMT_BGR24,
(AVPicture *)m_pFrameYUV,
m_pCodecContext-&pix_fmt,
m_pCodecContext-&width,
m_pCodecContext-&height);
Display();
m_hDecodeThread = NULL;
void CRTSPPlayer::Display()
HDC hdc = GetDC(m_hWnd);
// 创建内存DC
HDC hMemDc = CreateCompatibleDC(hdc);
// 创建位图
BITMAPINFOHEADER bmpHdr = {0};
bmpHdr.biSize = sizeof (BITMAPINFOHEADER);
bmpHdr.biWidth = m_nFrameW
bmpHdr.biHeight = -m_nFrameH
bmpHdr.biPlanes = 1;
bmpHdr.biBitCount = 24;
bmpHdr.biCompression = BI_RGB;
BYTE *pData = NULL;
HBITMAP hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)&bmpHdr, DIB_RGB_COLORS, (void**)&pData, NULL, 0);
memcpy(pData, m_pBufRGB, m_nFrameWidth * m_nFrameHeight * 3);
catch (CMemoryException* e)
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDc, hBitmap);
#ifdef SHOW_TITLE
// 设置字体参数
memset(&logfont, 0, sizeof(LOGFONT));
logfont.lfHeight = 40;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = 30;
logfont.lfItalic = 0;
logfont.lfUnderline = 0;
logfont.lfStrikeOut = 0;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfOutPrecision= OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision= OUT_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily= DEFAULT_PITCH;
// 创建字体并选入环境
HFONT hFont = CreateFontIndirect(&logfont);
HFONT hOldFont = (HFONT)SelectObject(hMemDc, hFont);
// 设置绘图环境
SetBkMode(hMemDc, TRANSPARENT);
SetTextColor(hMemDc, RGB(255, 255, 0));
// 绘制文字
TextOut(hMemDc,0,0,m_strFilePath,_tcslen(m_strFilePath));
// 恢复环境释放字体
SelectObject(hMemDc, hOldFont);
StretchBlt(
m_rcWnd.left,
m_rcWnd.top,
m_rcWnd.right-m_rcWnd.left,
m_rcWnd.bottom-m_rcWnd.top,
m_nFrameWidth,
m_nFrameHeight,
// 恢复并释放环境
SelectObject(hMemDc,hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hMemDc);
// 获取播放状态
RTSP_PLAYSTATUS CRTSPPlayer::GetPlayStatus(void)
return m_nPlayS
// 设置播放状态
void CRTSPPlayer::SetPlayStatus(RTSP_PLAYSTATUS playStatus)
m_nPlayStatus = playS
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2- 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
【精品】android rtsp流媒体播放介绍
下载积分:800
内容提示:【精品】android rtsp流媒体播放介绍
文档格式:DOC|
浏览次数:11|
上传日期: 05:16:05|
文档星级:
该用户还上传了这些文档
【精品】android rtsp流媒体播放介绍.DOC
官方公共微信

我要回帖

更多关于 android rtsp 播放器 的文章

 

随机推荐