菜鸟求教帖.图纸怎么阿里巴巴可以使用菜鸟,怎么打出高pts

网站压力性能免费在线测试:阿里云PTS等服务器
稿源:免费资源部落
经常看到不少人的在购买主机前会询问服务器的配置到底能够承受多少的访问量。这个问题其实比较难回答,因为影响服务器负载承受能力除了CPU、内存、硬盘等硬件条件外,还可能和你的Apache、Nginx、PHP、MysqL等优化有关系,另外还和你的Html、JS等文件有关系。
所以,为了防止突发的高请求对服务器负载能力产生的不利影响,同时也是为了检测网站Web压力,我们需要提前对服务器进行压力测试,预测自己服务器到底能够承受多大的访问量。首先我们可以对VPS或者服务器本身的承受力进行一个大致的检测,常用的方法就是Web压力测试。
之前部落也分享过一些Web压力测试工具:Webbench,Apache Bench,http_load,另外可在Windows平台使用的Web压力测试工具:Pylot,利用这些工具基本上就可以对自己的服务器的承载能力概况有一个基本的了解了。不过,为了能够更加精准地测试网站性能,还需要用到本文要介绍的工具。
阿里云PTS,是阿里云面向全网用户免费开放的性能云测试平台,官方给它取了名字:Lite(PS:也不知道英文名字是怎么想出来的),主要是提供压测目标和监控集管理,包括提供简单易用的性能测试脚本模板模式和代码模式、测试场景配置、测试执行及执行数据实时展示,还有提供完善的性能结果报表和强大的性能分析图形展示。
阿里云PTS还提供了一款应用性能监控工具:PTS Radar,用户只需要在服务器上安装它就可以对服务器和应用进行监控。采用无锁队列进行监控数据的传输,基本不会对系统造成额外的资源消耗。采集的性能数据可以和PTS性能测试数据进行关联分析。
阿里云PTS如果在国内使用自然有相当大的优势,不过国外的话还是选择功能同样强大的老牌网站性能测试工具:Load Impact,这是一家位于瑞典的领先的SaaS性能测试提供商,它可以模拟不同数量的用户向你的网站发送不同的请求,你可以看到CPU、内存、磁盘空间和网络带宽的变化情况。
利用Load Impact可以轻松获取到你的网站的用户承载数量的瓶颈。同样的服务还有loader.io,它比Load Impact更强大一些,支持定义页面头部信息、URL地址参数、授权密码等。loader.io测试结果能看到响应时间(平均/最小/最大相应时间),响应数(成功/超时/4XX错误/5XX错误),带宽(接收/发送)等信息。
阿里云PTS、Load Impact、loader.io虽然同为网站性能测试服务,但是各有各有的优势及不足,且可用于测试的免费配额也会不同。阿里云PTS每VUM(每分钟每并发用户数)¥0.004,每月每用户1万VUM免费使用。loader.io每次最多10,000个连接,每次测试时间限制为1分钟。Load Impact允许同时100个用户,最长5分钟测试。
网站压力性能免费在线测试:阿里云PTS,Load Impact,loader.io服务器负载能力测试
一、阿里云PTS添加测试目标网站和服务器
1、阿里云PTS官网:
官方网站:https://pts.aliyun.com/lite/index.htm
2、阿里云PTS原来是用于阿里云ECS性能测试用的,现在是对全网开放,关于ECS性能测试可以参考:阿里云服务器ECS购买方法和VPS主机性能与速度简单测试。
3、使用你的阿里云账号登录到阿里云PTS平台,然后直接在控制面板中添加你想要测试的网站域名。如果不是使用默认端口(如HTTP:80,HTTPS:443),请手工指定(如:www.example.com:8080)。输入中仅需提供host:port,不需要输入http://,https://或者URL路径。
4、添加测试网站后,还需要下载验证文件到网站空间上并保证能够通过URL正常访问。
5、下面还有一个添加监控服务器,这个主要是安装PTS Radar,将你的VPS的性能数据与阿里云PTS测试结合起来,便于你分析VPS的性能。
6、PTS Radar监控工具运行基于Java环境,安装监控工具前必须安装Java并已设置JAVA_HOME目录,Linux的话先下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html
7、根据你的Linux VPS系统位数选择不同的Java SE安装包,下载前记得勾选同意协议。
8、接着进入到Local目录:cd /usr/local,新建文件夹:mkdir jdk8,进入该文件夹:cd jdk8,将刚刚下载的安装包上传到这里,然后执行解压:tar zxvf jdk-8u51-linux-x64.tar.gz(注意换成自己的安装包)。
9、配置环境变量:vi .bash_profile,.bash_profile文件是隐藏文件,一般存在于Root目录下,找不到的可以执行命令:
cd ~ls -a|more
10、将以下命令添加到.bash_profile文件当中,
export JAVA_HOME=/usr/local/jdk8/jdk1.8.0_51export CLASSPATH=.:${JAVA_HOME}/libexport PATH=${JAVA_HOME}/bin:$PATH
有好的文章希望站长之家帮助分享推广,猛戳这里
本网页浏览已超过3分钟,点击关闭或灰色背景,即可回到网页博客访问: 10168
博文数量: 8
博客积分: 10
博客等级: 民兵
技术积分: 95
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
刚下了一个老版本的jrtplib-3.5.1和jthread-1.2.0,用VC++
6.0均编译通过,并且有编译过jrtplib中带的examples.可以看到用example中的程序发送简单的rtp数据包和接收rtp数据包的大概流程,但我如果要用jrtplib来传输H.264的视频流,该如何做呢?
这一两天在看rfc3550和rfc3984,看得一头雾水.. 还是不太明白我该从哪里入手?
不知道哪位朋友能不能提供几个用jrtplib封装H.264视频流进行传输的例子? 小弟将不胜感激啊!
先拜谢了! thanks~~路过,帮顶。。。帮顶没有人回答啊! 自己顶一下..
我想具体再问一下,如何把MPEG4(或H.264)的视频流拆分成一个个的RTP包?一个rtp包的最大长度为多少,rtp包头信息怎么填,payload
type等于多少?RTCP包要不要我来发送,如何发送,什么时候发送,发什么内容??
继续看rfc和jrtplib的帮助文档中… 郁闷啊!哎..高手呢,都到哪去了? 自己再顶一下..
今天把JRTPConsole的例子编译了下,ConsoleServer.exe程序可以运行(但组播发出去的数据,局域网内的其他机器有没有收到,暂时还没去确认)?ConsoleClient.exe程序运行报错,提示如下:
Error -74:The "bind" call for the RTP Socket failed. Press Enter to exit.
调试跟踪了一下代码, 是这个地方出错了,创建 rtpSession 失败,什么原因呢?&
//CREATE THE SESSION
int status = rtpSession.Create(sessParams, &transParams);楼主这个问题给的分太少老~~ 起码给500分才够~~
可以通过生成SDP文件给播放器在指定端口接收数据播放,如果你不用动态调整编码器什么的就不用考虑另外发送RTCP.
而且RTCP必须自己实现RTSP服务结合起来用,没有实现RTSP服务,就谈不上实现RTCP.
具体H264字节流拆包和RTP封包方法如下:
UINT MediaStreamH264::TransportData(PBYTE pData, UINT dataSize, int pts)
PBYTE p_buffer = pD
int i_buffer = dataS
UINT writeSize = 0;
while( i_buffer > 4 && ( p_buffer[0] != 0 || p_buffer[1] != 0 ||
p_buffer[2] != 1 ) )
i_buffer–;
p_buffer++;
/* Split nal units */
while( i_buffer > 4 )
int i_size = i_
int i_skip = i_
/* search nal end */
for( i_offset = 4; i_offset+2 < i_
i_offset++)
if( p_buffer[i_offset] == 0 &&
p_buffer[i_offset+1] == 0 && p_buffer[i_offset+2] == 1 )
found another startcode */
i_size = i_offset - ( p_buffer[i_offset-1] == 0 ?
i_skip = i_
/* TODO add STAP-A to
remove a lot of overhead with small slice/sei/… */
UINT iWrite =
TransportH264Nal(p_buffer, i_size, pts, (i_size >= i_buffer) );
(iWrite > 0 )
writeSize += iW
i_buffer -= i_
p_buffer += i_
return writeS
UINT MediaStreamH264::TransportH264Nal(const PBYTE pNal, UINT nalSize, INT32
pts, BOOL isLast)
ATLock atlock(&m_tlockRun);
if (m_bRun == FALSE)
if( nalSize < 5 )
UINT mtu = m_nMTU;
const int i_max = mtu - RTP_HEADER_SIZE; /* payload max in one packet */
int i_nal_
int i_nal_
i_nal_hdr = pNal[3];
i_nal_type = i_nal_hdr&0×1f;
if( i_nal_type == 7 || i_nal_type == 8 )
/* XXX Why do you want to
remove them ? It will break streaming with
* SPS/PPS change (broadcast) ? */
/* Skip start code */
PBYTE p_data = pN
int i_data = nalS
p_data += 3;
i_data -= 3;
int writeSize = 0;
if( i_data <= i_max )
/* Single NAL unit packet */
//writeSize = m_pRtpTransport->SetRtpData(p_data, i_data, pts, isLast);
writeSize = m_pRtpTransport->Write(p_data, i_data, m_nRtpPayloadType,
pts, 0, isLast);
if (writeSize <= 0)
return writeS
/* FU-A Fragmentation Unit without interleaving */
const int i_count = ( i_data-1 + i_max-2 - 1 ) / (i_max-2);
for( i = 0; i < i_ i++ )
const int i_payload =& (i_data
< (i_max-2)) ? i_data : (i_max-2);
const int nalSize = 2 + i_
m_Packet.ExtendBuffer(nalSize);
/* FU indicator */
m_Packet.m_pData[0] = 0×00 | (i_nal_hdr & 0×60) |
/* FU header */
m_Packet.m_pData[1] = ( i == 0 ? 0×80 : 0×00 ) | (
(i == i_count-1) ? 0×40 : 0×00 )& | i_nal_
/* FU payload */
memcpy( &m_Packet.m_pData[2], p_data, i_payload );
m_Packet.m_DataSize = nalS
//int iWrite = m_pRtpTransport->SetRtpData(m_Packet.m_pData,
m_Packet.m_DataSize, pts, isLast && (i == i_count-1));
int iWrite =
m_pRtpTransport->Write(m_Packet.m_pData, m_Packet.m_DataSize,
m_nRtpPayloadType, pts, 0, isLast && (i == i_count-1));
if (iWrite
writeSize += iW
i_data -= i_
p_data += i_
谢谢楼上的老大!代码我先收下了,慢慢再研究,当下一时半会我还领会不了啊:(
帖子已经加到
100 分了! 如有高手能给我彻底解惑jrtplib流媒体rtp传输的问题,我可以再另开5贴,散满 500 分啊!
有没有人编译了JRTPConsole的例子?我编译后的结果,ConsoleServer.exe程序可以运行(但组播发出去的数据,局域网内的其他机器有没有收到,暂时还没去确认)?ConsoleClient.exe程序运行报错,提示如下:
Error -74:The "bind" call for the RTP Socket failed. Press Enter to exit.
调试跟踪了一下代码, 是这个地方出错了,创建 rtpSession 失败,什么原因呢?&
//CREATE THE SESSION
int status = rtpSession.Create(sessParams, &transParams);
(ReportError(status))
//unable to create the session
我不太清楚,组播是不是和路由器里的设置有关系呢?我们公司有用防火墙..
等待高手答疑中…俺也只编译过JRTP的exmaple
你要是做直接看ffplay的源代码好了
好象最新的例子也支持RTSP/RTP了,都跟你说了,如果你没有实现RTSP服务,就没必要考虑RTCP,不考虑RTCP,干嘛还用jrtplib?
用jrtplib就是图用它封装的RTCP方便.
如果不图RTCP,还不如用其他的RTP库来发送数据来的好用方便.
你那个问题是bind失败.看看设置的bind地址是多少?
组播确实和路由支持有关系.但是跟bind没关系.先把bind失败问题解决吧.顶下可能是你的IP地址设置错误,检查一下。mark
jrtplib没做分包,需要自己实现。
可参考opal下面的plugin,videoh264相关代码,极简单。<
帮顶了帮你顶顶?????<
我再补一句.
我觉得已经不是散分可以解决的问题了…
你不如把你的工作需求告诉我.我直接帮你搞定最终程序,要求不高,散500块RMB给我吃火锅就行了…有高手啊/真高。我得好好学习了再次谢谢 ttxk 老大! 我的基础是太薄弱了,抱歉!!
我之前没有做过H.264的编解码,没有做过UDP传输,更不懂H.264的RTP流媒体传输.所以对您给过来的H.264字节流拆包和RTP封包代码,一时半刻肯定也接受不了,也不可能马上copy过来就可以用了.还请您见谅!
这几天我也有在看RFC、3984和JRTPLIB3.5.0的使用手册等等资料,不过这些全英文的文档,我想应该也不是一天两天就可以看得完,理解得透彻的吧?
这几天先把jrtplib里自带的例子在VC++6.0的环境下都编译通过了,并且可以运行起来,进行rtp数据包的收发,也用OmniPeek的抓包软件有看到RTP和RTCP的数据包.
有看到jrtplib文档中的这个函数,尝试过最大值为 65535 .
void SetMaximumPacketSize(size_t max)
Sets the maximum allowed packet size for the session.
也就是说,我只要把H.264的字节流拆包成规定最大值(64K byte)长度以内的rtp包,来传输,就可以了吗? <
顶!!!!!!!!<
什么是MTU? MTU是Maximum Transmission
Unit的缩写。意思是网络上传送的最大数据包。MTU的单位是字节。
大部分网络设备的MTU都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。
ttxk,那我把H.264的字节流拆包成规定最大值(1024
byte)长度以内的一个个rtp包来传输,应该就可以适应大部分的网络环境了吧?
1. 单一 NAL 单元模式
即一个 RTP 包仅由一个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的
H.264的NALU 头类型字段是一样的.
2. 组合封包模式
即可能是由多个 NAL 单元组成一个 RTP 包. 分别有4种组合方式:
STAP-A, STAP-B, MTAP16, MTAP24.那么这里的类型值分别是 24, 25, 26 以及 27.
3. 分片封包模式
用于把一个 NALU 单元封装成多个 RTP 包. 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29.
弱弱的问一下,一个NAL里的数据就是通过H.264编码后产生的视频字节流吗? NAL 是个什么概念?还不是太清楚呢…1.NAL概述
NAL全称Network Abstract Layer, 即网络抽象层。
在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
现实中的传输系统是多样化的,其可靠性,服务质量,封装方式等特征各不相同,NAL这一概念的提出提供了一个视频编码器和传输系统的友好接口,使得编码后的视频数据能够有效地在各种不同的网络环境中传输。
NAL单元是NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。头信息中包含着一个可否丢弃的指示标记,标识着该NAL单元的丢弃能否引起错误扩散,一般,如果NAL单元中的信息不用于构建参考图像,则认为可以将其丢弃;最后包含的是NAL单元的类型信息,暗示着其内含有效载荷的内容。
送到解码器端的NAL单元必须遵守严格的顺序,如果应用程序接收到的NAL单元处于乱序,则必须提供一种恢复其正确顺序的方法。
3.NAL实现编解码器与传输网络的结合
NAL提供了一个编解码器与传输网络的通用接口,而对于不同的网络环境,具体的实现方案是不同的。对于基于流的传输系统如H.320、MPEG等,需要按照解码顺序组织NAL单元,并为每个NAL单元增加若干比特字节对齐的前缀以形成字节流;对于RTP/UDP/IP系统,则可以直接将编码器输出的NAL单元作为RTP的有效载荷;而对于同时提供多个逻辑信道的传输系统,我们甚至可以根据重要性将不同类型的NAL单元在不同服务质量的信道中传输。
我想问一下,在一个H.264编码格式的AVI电影文件中,我可以用UltraEdit打开这个avi文件看到一个个的NAL吗?NAL的头和尾,分别是以什么标识符开始的呢??都是高手啊!
最近也在看h264 ,了解了一些h264实现原理,
现在热火朝天地看h264测试模型:JM 代码,都快把我看的快疯掉了。
今天也把jrtplib编译了一下,自带例子也能运行,也想研究下如何传输h264 视频流,
楼主你搞懂了别忘了教教我们这些小弟啊!
自己再来顶一下!~~
假设不考虑网络环境的MTU值,并且采用单一NAL单元模式(即,一个RTP包仅由一个完整的NALU组成).那么在PC端接收到rtp包后,是接收到一个rtp包就将这个包推给H.264解码器(ffdshow
或 x.264)去解码么?是不是所有的H.264解码器都是以一个NAL unit为基本解码单元来解码的??
x264_decoder_decode: decode one nal unit
这是X.264里;下面的是ffdshow里的
* Decodes a network abstraction layer unit.
* @param consumed is the
number of bytes used as input
* @param length is the length of the array
* @param dst_length is the number of decoded bytes FIXME here or a decode
rbsp tailing?
* @returns decoded bytes, might be src+1 if no escapes
static const uint8_t *decode_nal(H264Context *h, const uint8_t *src, int
*dst_length, int *consumed, int length)opal下面有一个h264组RTP流,并解RTP流,利用ffmpeg编码解码的程序,写的很好,可以参考一下。
另外,linphone也带了这样的插件。
jrtplib同作者还写了个emiplib,可以传263,忘记了是否有264没有,不过可以参考看看。<
自己再来顶一下!~~
我想请问一下,在PC端的H.264
decoder一般解码一路D1的视频图像,大概会占用多少CPU资源?10%以内??就按市面上一般的双核台式电脑的配置来看..
据我了解到的解码器,ffmpeg、t264、p264、JM、x264(早期的版本貌似也有decoder的部分)、ffdshow,哪一个解码H.264
baseline profile效率相对来说会要高些呢? 路过,最近要做一个视频服务器,采用linux+cgi+thttpd,发现要传送视频流还是绕不开rtp协议,痛苦学习中……共勉之!昨天通过
svn://svn.mplayerhq.hu/ffmpeg/trunk
获取了最新的ffmpeg更新,用MINGW5.1.4+MSYS编译,先./configure –enable-shared
–enable-memalign-hack –disable-debug –enable-s
–disable-static,耗时约1个半小时,然后make,耗时将近两个小时. 整个耗时,差不多4个小时!
我的电脑基本配置, Intel(R) Pentium(R) D CPU 2.66GHz, 2GB的内存.
想请问一下各位编译过最新版本ffmpeg的朋友,是我的电脑配置太差了的原因,还是最新版本的ffmpeg太大了?大家编译ffmpeg的时候,一般是多长的时间啊??
再想请问下,make
install安装后的ffmpeg,avcodec-52.32.0.dll,avcodec-52.dll,avcodec.dll这三个dll大小都是2676KB,请问它们之间有什么区别?在写应用程序调用dll方面有何不同??不能让这个帖子沉了,顶起来!~~
再问个问题:
我手头上有ffdshow_src_源码,编译过了,然后用它来实现H.264的解码.发现ffdshow解码一路D1时,占用CPU达到20%多,效率不高,于是想能不能更新ffdshow中用到的解码器(ffmpeg最新的源代码已经通过SVN下载,并且编译过了)部分?是不是涉及到从ffmpeg中提取H.264解码器的问题?
今天有粗略的看过一下最新的ffmpeg源代码,发现和ffdshow_src_中的ffmpeg部分(libavcodeclibavformatlibavutil)相差很大,代码文件有增加,数据结构的定义也多了很多…
所以我在想, 上面我想通过更新ffdshow中的ffmpeg部分,用以来提升ffdshow_src_编解码效率的方法,是不是可行?
还望高手指教啊!
也希望可以多结交一些做流媒体H.264编解码FFMPEG,做安防行业的朋友,我的联系方式:
MSN:pan_,QQ:,上班时间一般都在线! 自己再来up一下!~~
下了个最新版本的CoreAVC 1.9.5.0,果真是强悍!在我这破电脑【Intel(R) Pentium(R) D CPU 2.66GHz,
2GB的内存,GeForce 6200 TurboCache(TM)
独立显卡】上,解码1路D1,cpu占用率大概可以跑到10%左右,不到15%.估计配一台现在主流的Intel 酷睿2双核电脑,应该可以稳定到 10%
以内,基本上就能满足我PC端同时解码9路D1的需求了.
接下来,我要做的工作就是自己写一个dshow filter来完成对视频的一些处理,比如:做视频图像的上下左右镜像翻转 等等..
有没有哪位高手自己写filter实现过视频翻转的功能,能不能给小弟我一点指点啊!? 或是网上有这方面的开源资料,
哪位大虾能不能提供个demo参考一下呢?? 不胜感激啊..都是高人啊,看一下,得到很大帮助用dshow
filter解码,可以用CyberLink 264 Decoder Filter.
能够启用显卡硬件h264解码(如果支持),解码过程基本不耗cpu.想实现翻转?
那还是用回ffdshow吧.里面有很多实时处理滤镜,翻转,旋转,字幕等等功能都有.<
自己再来顶一下!~~
最近上网了解了一些关于市场主流显卡(ATI和Nvidia)硬解H.264视频方面的知识,也有下载Nvidia CUDA SDK
V2.3看了看,接触到了一些新的名词:GPU,UVD,CUDA,DXVA,Avivo? HD,PureVideo技术等等…
突然很多的困惑,也应运而生了.
随着蓝光技术和HD DVD电影等等的普及,我想以后的市场主流显卡大概都会支持H.264硬解的功能吧?..因为用CPU(以Intel酷睿2
双核E8XXX系列为例)来解码一个1080P全高清的影片,很占资源,CPU的占用率可以到80%以上;但如果启用显卡的硬件加速,GPU可以分担大部分H.264解码的任务,减轻CPU的负担,从而可以让电脑在观看影片的同时做更多的事情…
这样,我就有个问题了,现在主流的ffmpegffdshow 等等H.264 codec有多少是支持显卡硬解H.264视频的?
有多少是可以利用GPU里的SP进行运算的?
要使ffmpeg来支持Nvidia 的CUDA视频加速,软件上的改动大吗,难么?? 我是楼主,不能让这个帖子沉了,顶起来!~~
还是回归到本帖子的标题,问一个用jrtplib传输H.264视频流的问题:
我已经采用单一NAL单元模式,在linux平台下可以实现用jrtplib传输一个个的H.264 nalu了.现在的问题是,如果我要实现在PC端用VLC播放器可以播放我在linux端用rtp传输的H.264视频,该怎么做?在网上大概查了一些资料,好像说是要和VLC发送rtsp的数据,用以建立两者的连接?
包括 DESCRIBE请求消息处理过程、SDP消息组装过程、SETUP请求消息处理过程、PLAY请求消息处理过程 等等…
ttxk大哥,这个问题是不是就是你之前说的要实现RTSP Server服务?
哪位牛人,能不能再给我一些指导 或是 给我一个H.264
RTSP连接的建立过程的参考代码??顶下~
最近也在研究~
代码收下咯~
O(∩_∩)O~啥东西???密切关注!我也顶下,不能沉了。你提问的问题,我前一段时间全都解决了,我是用写了一个RTSP/RTP
流媒体服务器,将实时的流转码成H.264后发送到给客户端,用到了jrtplib发送H.264数据.你具体有什么问题可以请教我,不过要给分啊
我的流媒体服务器可以用VLC,quicktime
player和RealPlayer还有手机上的coreplayer等播发器播放,只要输入正确的URL就可以&
各位好,小弟接触RTP/RTCP/RTSP一点都不久,最近需要做一个类似如下功能的东东,请各位帮忙解答解答,谢谢!
功能说明:在服务端将一个多媒体文件(如H.264)用RTP打包后发送到另一台机子的客户端,客户端用VLC或MPLAYER接收数据流。功能就是这样,应该不算很难,但由于是刚刚接触,对这方面的知识都不是很了解,所以就有劳各位了。
& 饭要一口一口吃,我想把实现分为4步骤:
1.单纯用UDP传输文件,让VLC或MPLAYER接收UDP流(注:这个实现服务端传输没问题,只是想问下
VLC或MPLAYER能直接接收这样的UDP数据吗,如果可以该怎么进行,我试过直接在服务端传输UDP数据,MPLAYER使用udp://10.0.0.127:6666,但MPLAYER一点反应都没有。)
& 2. 在原始数据基础上加上RTP头(问题跟上述一样,这样VLC能接收到数据并播放吗?)
& 3. 在第2步基础上使用RTCP控制
& 4. 在第3步基础上加上RTSP& 上边的步骤只是俺这个菜鸟通过皮毛接触后想的,也不知道正不正确,恳请大家帮忙解答下,谢谢了!!!
弱弱的问下,是不是VLC一定要使用SDP啊,如要需要,这个SDP文件是通过服务端一并发送的还是就在客户端写好数据呢?
还有,用UDP传输数据时,是不是服务端直接发送数据啊,我只记得之前编UDP程序的时候是客户端先SENDTO,服务端RECIVE,这样服务端获取了客户端的具体信息后方开始数据传输,那上边这个需要这样的步骤吗,要需要该怎么弄啊,难道VLC会自个SENDTO数据到服务端????
RTP,H264的新手,密切关注此贴!<
楼上的大佬,你有没有联系方式,msn,qq?
我的联系方式: MSN:pan_,QQ:,上班时间一般都在线!&
前段时间我也下了一个live555-latest,然后用VC6编译了那几个库,并且也可以用VC6创建工程编译和跟踪调试
estProgs目录下的那些app.但一直不知道该如何在live555MediaServer里添加有关对于h.264的支持?而且对整个庞大的live555的架构也都一直没搞清楚:(
…& 感觉有点难,无从下手
langang0207 大哥,能不能提供一些源代码给小弟参考?或是写过一些比较有帮助的经验总结文档,可以贴出来供大家参阅的? 我是楼主,自己来up一下!
最近在学习live555,想在live555MediaServer里添加有关对于h.264文件streaming的支持,不知道有没有朋友在搞这些东西?
看了live555的代码,有个问题想请教:
ByteStreamFileSource::createNew(UsageEnvironment& env, char const*
fileName,unsigned preferredFrameSize,
unsigned playTimePerFrame);
这个函数的preferredFrameSize和playTimePerFrame 这两个参数,怎么理解?
如果我的应用程序要传输不同的h.264文件,是不是每次传输前都要根据视频文件本身把preferredFrameSize和playTimePerFrame
计算出来,然后再赋值?传输的文件不同,这两个参数也就不同吧??还是说统一的可以赋一个固定的值???> 佩服…
在这里见到了传说中的高手.传说中每日顶一下好贴会有福的.langang0207 大哥,怎么没看到你了? 上来指点一下小弟我啊!
有关live555的代码中:
ByteStreamFileSource::createNew(UsageEnvironment& env,
char const* fileName,unsigned preferredFrameSize,
playTimePerFrame);
这个函数的preferredFrameSize和playTimePerFrame两个参数,我是这样来赋值的:
preferredFrameSize=filesize/time*fps , playTimePerFrame=1sec/fps
现在运行VLC,打开rtsp://192.168.10.62/test.h264,基本上也能看到我h.264视频文件的影子,不过解码后显示出来的马赛克很多(vlc单独在本地播放该文件,是没有任何问题的,图像是清晰的),视频图像效果不好…
而且有时候还会造成vlc crash?
对这两个参数preferredFrameSize和playTimePerFrame进行微调,发现对vlc端看到的视频图像有稍许的影响,不过,还是会有大面积的马赛克.
期待传说中的高手来解答我这个菜鸟心中的疑惑!langang0207 小刚哥,怎么最近都没来了呢?& 俺还一直在等你的答复呀!
想问一下你,你最后是用MPEG TS流来传h.264 nalu的吗?因为我看live555 的mail list,很多人都是想用MPEG TS流来实现…
晕,最近又研究了下ffmpeg…哎!..
想把ffmpeg(准确的说只是其中有关decode的很小一部分)封装成一个dshow decode
filter,用来解码h.264的视频.大概能看懂ffplay里有关video
file的播放流程,但不是很明白,如果不是解码播放一个视频文件,而只是解码网络上过来的视频流,该如何写?比如:已经得到了一个buffer(就是filter里的一个Media
Sample),如何调用avcodec_decode_video()来对它进行解码呢??
有没有哪位大哥做过这方面的工作,或是给一些参考的网络链接也可以啊!
额滴神啊!救救我吧…. 头大! 哎…http://ttxk.blog.163.com/blog/static//
把H264的字节流文件复用为TS流文件的小工具.
http://ttxk.blog.163.com/blog/static//
使用UDP或者RTP协议发送TS流文件的小工具.
可以用shell命令行方式调用这2个小工具实现发送H264流文件 ~~!看来楼主做的事情跟小弟的差不多,不过小弟还得在客户端自己写一个播放器,学习中ttxk
大哥,你那工具是windows下的?我要arm-linux平台下的东西…呵呵,ttxk,你就是VLC群里的"裤子"?
你搞的那些东西open
source 不? 都是从VLC里抽离出来的东西,共享给大家,让我们也好多学习学习嘛!
最近几天在写dshow decode
filter,已经在VC6下把filter的整体框架都搭建好了,并且用MINGW+MSYS编译了ffmpeg,想在VC里使用ffmpeg的lib静态库,出现了下面的问题:
之前没有使用extern "C",直接#include ,#include
Build后,有以下错误提示:
error LNK2001: unresolved external symbol "void __cdecl
avcodec_register_all(void)" (?avcodec_register_all@@YAXXZ)
接着修改为: extern "C"
重新编译,出现另外的错误提示:
e:program filesmicrosoft visual
studiovc98includemath.h(513) : error C2894: templates cannot be declared to have
'C' linkage
请大虾指点! 今天调这个调了一天了,郁闷啊!…上面的问题,凑合着解决了!
直接在 math.h
里找到templates,把其相关的那部分代码屏蔽掉,ok.
大家如果有什么更好的解决方案,欢迎一起来讨论.
我的联系方式:
MSN:pan_,QQ:,上班时间一般都在线!
现在将用ffmpeg做h.264解码遇到的新问题,贴出来:
初始化部分
avcodec_init() ;
avcodec_register_all();
pDCodecCtx = NULL;
avcodec_find_decoder(CODEC_ID_H264); //CODEC_ID_MPEG4 CODEC_ID_H264
pDCodecCtx = avcodec_alloc_context();
pDPicture = avcodec_alloc_frame();
if(avcodec_open(pDCodecCtx,pDCodec) <0)
& return E_FAIL;
long bufsize=pIn->GetSize();
deImage =(unsigned
char*)malloc(bufsize);
nDataLen = pIn->GetActualDataLength();
(pIn->GetPointer((BYTE**)&deImage) != S_OK)
return S_FALSE;
if (pOut->GetPointer((BYTE**)&pDPicture) != S_OK)
return S_FALSE;
nGet = avcodec_decode_video(pDCodecCtx, pDPicture,
&frameFinished,
& & & deImage, nDataLen);
return S_OK;
部分数据定义
AVCodec*& & & & & pDC
AVCodecContext*& & pDCodecC
& & & & pDP
int nGet,frameF
unsigned char* deImage=NULL;
int nDataL
调试代码,结果如下:调用解码第一帧数据,一切都是ok的,avcodec_decode_video完后的返回值为数据帧长度,frameFinished>0.&
问题出在解码第二帧的时候, 当程序再次跑到avcodec_decode_video,执行完后显示错误信息: Unhandled exception in graphedt.exe
(AVCODEC-52.DLL):0xC0000005:Access Violation.
我的代码里没有用到AVPacket这个结构体,应该没什么关系吧?
感觉是不是因为我的buffer空间没有释放的原因?我现在是想用ffmpeg写一个dshow decode
filter,目前还只是刚开始写,很多不完善的地方请大家见谅!
祝大家国庆中秋长假玩得开心啊! 明天回老家,国庆在湖南结婚摆酒o(∩_∩)o不错,学习了我是楼主!回来上班了..
上面的问题解决了.之前用到的ffmpeg
dll和lib库,是自己用MSYS+MINGW编译的,可能confiugre得有点问题,后来换成用佰锐的FFmpeg-full-SDK-3.2里的dll和lib库,ok了:-)
其中解码部分有简单的改动,把代码贴出来:
int nGet,frameFinished=0;
unsigned __int8*
unsigned char* pDestB
int nDataL
*frame= avcodec_alloc_frame();
(pIn->GetPointer((BYTE**)&pSourceBuffer) != S_OK)
& & return
if (pOut->GetPointer((BYTE**)&pDestBuffer) != S_OK)
& & return S_FALSE;
// allocate the video frame to be
nDataLen=avpicture_get_size(pDCodecCtx->pix_fmt,
pDCodecCtx->width,pDCodecCtx->height);&
long& dwSrcLength =
pIn->GetActualDataLength();
long& dwDstLength = pOut->GetSize();
nGet = avcodec_decode_video(pDCodecCtx, frame, &frameFinished,
& & pSourceBuffer, dwSrcLength);
if (frameFinished>0)
& // read the data to the pOut buffer
& & & & avpicture_layout((AVPicture
*)frame, pDCodecCtx->pix_fmt, pDCodecCtx->width,
pDCodecCtx->height,pDestBuffer,nDataLen);
pOut->SetActualDataLength(nDataLen);
& & & & pOut->SetSyncPoint(TRUE);
& & & & av_free(frame);
return S_OK;
return S_FALSE;
在dshow filter里Transform(IMediaSample *pIn, IMediaSample *pOut)里处理的一个Media
Sample即为一个可以解码的完整frame(nalu?),不需要再对bitstream做解析,av_parser_parse2这个函数没必要调用.
/********************************************************************/
please firstly parse your bitstream by& av_parser_parse2() to get a whole
frame before you feed it to avcodec_decode_video()
int av_parser_parse2(AVCodecParserContext *s,
& & & & & & & & & &
AVCodecContext *avctx,
& & & & & & & & & & uint8_t **poutbuf, int
*poutbuf_size,
& & & & & & & & & & const uint8_t *buf, int buf_size,
& & & & & & & & int64_t pts, int64_t dts,
& & & & & & & & & & int64_t pos);
/********************************************************************/
现在解码H.264基本上是ok的了,但还有两个小问题,俺一直比较迷惑:
1.在CheckInputType(const CMediaType *
mtIn) 函数中,如何判断video的sub type类型?
#define FOURCC_H264
mmioFOURCC('H','2','6','4')
switch(hdr->biCompression)
FOURCC_mp4v:
case FOURCC_MP4V:
if (!(g_config.supported_4cc &
SUPPORT_MP4V)) {
CloseLib();
return VFW_E_TYPE_NOT_ACCEPTED;
case FOURCC_DIVX :
if (!(g_config.supported_4cc &
SUPPORT_DIVX)) {
CloseLib();
return VFW_E_TYPE_NOT_ACCEPTED;
case FOURCC_DX50 :
if (!(g_config.supported_4cc &
SUPPORT_DX50)) {
CloseLib();
return VFW_E_TYPE_NOT_ACCEPTED;
case FOURCC_XVID :
& case FOURCC_H264:
fVideotype=
DPRINTF("Unknown fourcc: 0x%08x (%c%c%c%c)",
hdr->biCompression,
(hdr->biCompression)&0xff,
(hdr->biCompression>>8)&0xff,
(hdr->biCompression>>16)&0xff,
(hdr->biCompression>>24)&0xff);
VFW_E_TYPE_NOT_ACCEPTED;
怎么我有的h.264的视频文件CheckInputType连接不了呢?
h.264的视频文件hdr->biCompression除了FOURCC_H264,还有什么其他类型??
2.在GetMediaType(int
iPosition, CMediaType *mtOut)函数中,如何定义输出的mediatype?
USE_IYUV =
USE_YV12 =
switch(iPosition)
USE_IYUV )
bmih->biCompression = CLSID_MEDIASUBTYPE_IYUV.Data1;
bmih->biBitCount = 12;
mtOut->SetSubtype(&CLSID_MEDIASUBTYPE_IYUV);
& if ( USE_YV12 )
bmih->biCompression =
MEDIASUBTYPE_YV12.Data1;
bmih->biBitCount = 12;
mtOut->SetSubtype(&MEDIASUBTYPE_YV12);
& & return VFW_S_NO_MORE_ITEMS;
这样写,视频图像是可以正确的显示出来.但我在GE里调试的时候看到,在decode filter和video render中间系统会自动加上avi
decompressor和color space convert filter,最终把media type转为RGB32给video render. 为什么呢?
如果把USE_IYUV部分屏蔽掉,是直接使用YV12输出的话,就会在decode filter和video render中间系统会自动加上avi
decompressor filter,最终把media type转为YUY2给video render显示.
dshow的VMR不是可以支持直接显示YV12的吗? 还是我哪里写得有问题?? 不顶不行 关注自己来顶一下!
好不容易,上面的两个问题,基本上算是解决了.
1.在CheckInputType(const CMediaType * mtIn)
函数中,加入其他几个h.264类型的定义:
#define FOURCC_h264 mmioFOURCC('h','2','6','4')
#define FOURCC_X264 mmioFOURCC('X','2','6','4')
参考了ffdshow的部分代码.
2.在GetMediaType(int iPosition, CMediaType *mtOut)函数中,还是无法使用YV12类型正常显示出来,视频图像出现色彩条纹?
所以,索性使用sws_scale将avcodec_decode_video解码后出来的图像转为RGB32,现在显示都是ok的了.
不过,又引出了一个新的问题..
当我解码一段尺寸大小704*480长30sec的h.264视频,用graphedit调试,从解码最开始内存的占用大约为25MB,到解码最后结束时,内存的占用为45MB.在整个解码的过程中,内存的消耗呈递增的趋势,为什么呢?郁闷啊..
实在我在使用avcodec_decode_video解码完每一帧的数据后,都有释放使用到的buffer啊!?
av_free(buf);
av_free(frame);
av_free(pFrameRGB);
请高手帮忙分析一下,是什么原因导致ffmpeg解码占用的内存不断递增呢?? 哎…头大..看看天书RTP 新手 关注关注
这个拆包 的很有价值 学习学习再来顶一下! 上面的问题,基本上都解决了.
sws_freeContext(ctx);
原来查了半天,是这个地方没有free,所以导致在解码的过程中,内存的消耗会递增… 晕哦!..
现在想开始接着用ffmpeg写h.264 encode,把这部分功能也做到上面的xvid
filter里,相当于这个filter即可以实现mpeg4的decode,同时也能实现h.264 decodeencode功能.
想请问一下,我这个filter如何根据连接的上游filter来判断到底是要做decode呢,还是encode?是在CheckInputType(const
CMediaType * mtIn) 这个函数里来判断吗??
另外,还想问一下,用ffmpeg来做h.264
encode输入格式是什么?可以支持用rgb24或rgb32来编码么?还是只支持yuv420p的输入??
我参看apiexample.c的代码里,是设置成PIX_FMT_YUV420P的.楼主,你最后是不是把压缩的流分成一个一个1.5k左右的小包发出去的,然后在那边再合并起来,然后解压缩?
能不能说个大致的流程?
好贴 呵 这个帖子真的非常好,希望高手们继续讨论下去啊,让我们这么新加入流媒体开发的菜鸟们长点见识,呵呵期待继续。<
ttxk 大哥:
您能推荐个网址或者给点什么资料来学习用jrtplib传输播放流媒体吗?我的邮箱是lmj_,网上介绍的关于jrtplib的例子全是关于传一串数字的,感觉就没有真正地应用过jrtplib库,想用jrtplib+DirectShow+H.264做个流媒体的网络播放器,但毫无头绪,都不知道怎么下手.
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 谢谢了!to : lmjmn123
1,我也没怎么用过jrtplib。
2,做网络播放器,要看你接受什么样的数据流。
如果是接收H264InTs就比较简单。做一个数据源filter,在指定端口接收TS数据,然后向后推送就行了。找个现成的TsDemux
filter以及相关的解码filter注册到系统里就行。
如果是使用3GPP,或者ISMA,或者DVB-H点播协议接收H264数据流,你需要写一个RTSP请求,根据相关协议在服务端获取到媒体流的相关信息和数据库端口,再在指定端口上接收RTP数据,解除RTP封装后,还原为H264的字节流数据,然后将数据向后推送。同样需要找个能够解码H264字节流的filter注册到系统里面。谢谢 ttxk 老大的捧场了!
我是楼主.最近暂时没做jrtplib的h.264视频流的传输了,在做ffmpeg的h.264 encode/decode dshow
filter的封装.现在h.264 encode filter也基本上ok了,encode完,后面接一个dump
filter写成asf文件,可以用QQ影音的播放器解码播放出来.不过效果跟video capture
filter过来的视频源相比,还是有点点差距,自己不是很满意了,可能参数方面还要做细微的调整?..
现在还有个小问题:
我的整个filter是在xvid decode filter源码基础上改的,现在用ffmpeg实现h.264
encode功能后,在pinout 的输出type上还有点问题. encdoe filter后接h.264 decode filter,连接报错?
HRESULT CXvidDecoder::GetMediaType(int iPosition, CMediaType *mtOut)
…. 前面部分省略
switch(iPosition)
& if (USE_YV12)
bmih->biCompression = FOURCC_H264;
bmih->biBitCount = 12;
mtOut->SetSubtype(&MEDIASUBTYPE_YV12);
& & return VFW_S_NO_MORE_ITEMS;
& bmih->biSizeImage =
GetBitmapSize(bmih);
& mtOut->SetType(&MEDIATYPE_Video);
mtOut->SetTemporalCompression(FALSE);
mtOut->SetSampleSize(bmih->biSizeImage);
& return S_OK;
请问各位老大,是不是我pinout输出type的设置哪里还有问题?? 我是楼主,自己再来顶一下..
最近在调试Streaming Client端的程序,使用live555接收streaming server传输过来的h.264
rtp视频流,然后解码,播放.
现在live555的rtp数据接收基本上是可以了,不过在解码这块还有点小问题,想问一下:如何从SPS帧里解析出video width and height呢?
部分代码如下:
parse SPS for extract video width and height….
if(naltype
& unsigned char* data = &_pcbdata[4];
& int len = 0;
int val = 0×00;
& int bitoffset = 0;
& val = _get_ue(data, 64, bitoffset, &len);
& bitoffset +=
val = _get_ue(data, 64, bitoffset, &len);
& bitoffset +=
= _get_ue(data, 64, bitoffset, &len);
& if(val == 0) {
bitoffset +=
val = _get_ue(data, 64, bitoffset, &len);
else if(val == 1) {
& & & & } else {
// don't anything
& bitoffset +=
& val = _get_ue(data, 64, bitoffset,
& // gaps_in_frame_num_value_allowed_flag bit
& bitoffset ++;
& // get width
& bitoffset +=
& val = _get_ue(data, 64,
bitoffset, &len);
& m_nWidth = (val + 1)*16;
& if(m_nWidth==144)
m_nWidth=176;
& _ptHdr->nWidth = m_nW
& _ptHdr->cSeqLow&
= m_cbSeqL
& // get height
& bitoffset +=
_get_ue(data, 64, bitoffset, &len);
& m_nHeight = (val + 1)*16;
if(m_nHeight==128)
m_nHeight=120;
& _ptHdr->nHeight = m_nH
编码端的参数设置为720*480,怎么我执行这段代码从SPS里解析出来的video width and height为608*480呢?
请各位高手给小弟答疑啊!..自己来up,不能让这个帖子沉了啊!
上面的问题基本上搞清楚了.其实不用俺根据SPS去计算video width and height这么麻烦,直接用ffmpeg就可以了.
= avcodec_decode_video(pDCodecCtx,frame,&frameFinished,& & & & &
pSourceBuffer,dwSrcLength);
在调用这个前,pDCodecCtx->width和pDCodecCtx->height不用去赋值,avcodec_decode_video执行完后,ffmpeg会自己将video
width and height计算出来.
只是如果是要写成一个DShow decoder
filter,pDCodecCtx->width和pDCodecCtx->height如果不事先赋值,decoder
filter的pinout无法连接video render,会报错. 好像是dshow
filter架构里有这样的要求?
现在我已经用live555搭建起了一个streaming
server,可以发送和接收h.264的视频,并能正常的解码播放出来.目前我想把PC端的live555接收h.264网络视频流这部分封装成一个dshow
receive filter(source filter),不知道有没有哪位高人做过这方面的工作? 给小弟我一些指点啊~!
DXSDK90ASamplesC++DirectShowFiltersDSNetwork 这个sample进行修改,不过感觉代码写得很复杂,比较庞大…
不知道哪位大虾有没有关于介绍source filter架构的资料? 貌似DirectX SDK DOC里没这方面详细的说明..?我在进行H264的RTP传输过程中也碰到问题了。
在传输字节流的时候解码端可以正常编码并显示图像,但在按照RFC3984的方法封装了字节流之后,在接收端
重组成NALU并交给解码端进行编码就出现问题了。
上网看了一下有些人说不用传输PPS和SPS,说可以从SDP中获得。ttxk给出的代码好像也是这样的。但我不明白为什么字节流没问题,而RTP传输就出现问题了呢?这两种传输方式有什么重要区别吗?
另外在进行RTP传输的时候需要注意什么问题呢?如果我不用SDP获取相关参数,而仍然传输PPS和SPS,这样有没有问题呢?
谢谢楼上的朋友!
传输的部分基本上算是完成了,剩下的工作就是把live555实现的传输部分封装成dshow source
filter(network receive),不知道哪位大虾能不能给些指导啊?
接下来,俺想做的工作就是脱离DShow的架构,自己用Ddraw或是D3D9来实现视频的显示.有没有哪位高人能给我点帮助呀?
今天上网搜了一天都没找到有关ddraw的资料,不知道哪位朋友有DirectX 7.0或8.0的SDK?想看些关于ddraw的资料和samples..
希望可以多结交一些做流媒体H.264编解码FFMPEG的朋友,我的联系方式:
MSN:pan_,QQ:,上班时间一般都在线! 我是楼主,自己再来顶一下..
今天突然遇到个问题,上来问一下:
如果我的ipcam端只实现了rtp和rtcp,没有支持rtsp协议的话,那应该用VLC也可以播放ipcam端的视频流,看到图像吧?
因为我看VLC的支持网络协议那里有写支持HTTPHTTPSRTSPRTPMMSUDPFTPRTMP 的, 但我不知道如果是rtp协议的话,播放地址要如何写呢?
rtsp://192.168.10.144:554/ipcam, 这个是我ipcam rtsp的播放地址. 那rtp的地址要如何输入呢??
因为没那么多时间和精力再去研究VLC的源代码了,所以只想知道如何使用vlc播放器播放rtp视频流就可以了.请各位达人给我些指点! thanks.你另开帖子问吧,一个帖子问一个问题就行了,不要没完没了的在一个帖子里问N多问题 ,尊重一下回你帖子的人。这几天有空,在试着将live555的网络接收部分封装成dshow source filter.Filter方面的东西没有自己重写,直接在DShow
Samples Ball的架构基础上修改的.
编译后,出现以下问题:
& Creating library Debug/ball.lib and object
Debug/ball.exp
CVPACK : fatal error CK1022:
cannot open program database
d:udp\_svndavinciwindows
etclientlibrarylivemedia_a.libusageenvironmentdebugvc60.pdb
: warning LNK4027: CVPACK error
Error executing link.exe.
ball.ax - 1 error(s), 1 warning(s)
奇怪的是,最后在Debug 的目录下也能生成ball.ax,不过在调试的时候却不能在代码中的任何一个地方设置F9断点进行调试? 是不是因为那个
*.pdb文件的问题??
按照google中搜索到的相关问题解决方法也都尝试过,把Debug目录下的pdb文件删除,重新Rebuild
all,还是同样的问题? 甚至,把整个Debug目录全都删除,电脑重新启动,重新Rebuild all,这个错误依然存在?
有人跟我说,这个是VC++6.0自身的问题? 但我现在不想换用VS2008或是其他IDE,改动太大了.
只要能帮我解决在调试的过程中,能够设置断点的问题,就可以了..
先拜谢了! 这个问题,调了一两天了,都没解决… 郁闷死了..哎刚转做流媒体方面,学习学习!我是楼主.上面的问题已解决!
在 LinkProject
Options:设置里,除了添加/pdb:"Debug/ball.pdb"外,后面还要添加一条/pdbtype:sept。OK,这个问题就此解决.
最近没有写代码,在测试WCDMA 3G的视频传输和手机端的流媒体视频播放,用的是MOTO A3100(windows
mobile6.1的系统)手机进行测试.个人感觉MOTO的这款智能机做得不咋滴,wm6.1跑起来很慢,而且WIFI也做得不是很稳定,不知道是wifi芯片的问题,还是wm6.1下driver的问题?
在手机上装了一个CorePlayer1.3.6 build7427 汉化版,发现这个播放器太TMD牛B了!不但支持的视频格式很多,h.264mpeg4
等等,而且还支持很多流媒体的网络传输协议,包括rtsp
tcpudp等等…播放出来的效果也不赖,只可惜不是开源的呀!
真想看看代码,好好学习下..& 膜拜!
唯一测试发现一个问题:在播放rtsp的视频流时,延时有点点大了,大概有4到5秒的样子?..是我CorePlayer播放器哪里没设置好,还是其他原因?
要是能把延时降低到一两秒,那就真是太完美了哈…
欢迎用过CorePlayer的朋友,一起来讨论下!太猛了 帮助顶一下~学习学习,又要开始搞这个了.自己再来顶一下!
这段时间把live555基于Ball filter的基础上,修改,封装好了,这几天在调试.发现个让人棘手的问题:
live555的rtp数据包接收是正常的.在live555中将接收到的nalu写成一个h.264的视频文件,然后单独用播放器播放该264文件,解码出来的影像是ok的,没有任何马赛克;
2. 在Ball的基础上,修改了两个地方:
在 HRESULT CBallStream::FillBuffer(IMediaSample
*pms) 函数中,将live555接收到的数据copy过来;
memcpy(pData,recevH264Data,bufLength);
pms->SetActualDataLength(bufLength);&
重写了HRESULT
CBallStream:DoBufferProcessingLoop()方法,稍微做了小小的改动而已,用以控制推模式source
filter往后面的filter推数据的速率;
最后出来的视频效果是:在静止的状态或是画面中人物运动量不大的情况,画面基本上是过得去的;但只要人物动作过大,画面就是整屏大面积的马赛克.&
这个是什么原因导致的呢? 是FillBuffer 中copy过来的数据不对,还是因为DoBufferProcessingLoop()中推数据的速率控制得有问题?
反正不是live555丢帧了,因为写到文件里的视频,播放出来是没有任何马赛克的.
请高人过来,给小弟我一点指点了! thanks….我是楼主. 谢谢大家持续对本帖的关注!也多谢各位的捧场!
有个事情需要郑重宣布下:从本周开始我们公司内部封QQ了,俺家里的电脑也没上网,晚上回家去也用不了QQ.所以上面有留本人的QQ联系方式,暂时无法和大家联络!
请加我的MSN: pan_
因为上班时间有人在QQ上偷菜,被别人告发,所以老板一声令下,把整个公司的QQ都屏蔽掉了,包括研发部门!真是人间杯具啊!希望不要把 msn 都封了..?
这一两天看了下PushSource的代码,觉得写的还行,是直接bmp贴图到video
render上的,还可以进行fps的控制.参照部分代码,在我的ball filter上做了修改,只是调试起来,还是老问题!? 哎,动作一大的话,马赛克太多!
我怀疑,是不是我ball filter里
HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)& 和
HRESULT CBallStream::DecideBufferSize(IMemAllocator *pAlloc,
& & & & & &
& & & & & & & & & & & & & ALLOCATOR_PROPERTIES *pProperties)
写得有问题?
这两个地方写得不好,会导致画面马赛克吗??
静待高手的光临!我再顶!不能让这个帖子沉了..
下面,我把DecideBufferSize和GetMediaType这两个函数的部分代码贴出来,请大虾帮俺看看:
CBallStream::DecideBufferSize(IMemAllocator *pAlloc,
& & & & & & & & & & & &
& & & & & & & ALLOCATOR_PROPERTIES *pProperties)
CheckPointer(pAlloc,E_POINTER);
& CheckPointer(pProperties,E_POINTER);
& CAutoLock cAutoLock(m_pFilter->pStateLock());
& HRESULT hr =
& VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER*) m_mt.Format();
& // Ensure a minimum number of buffers
& if (pProperties->cBuffers ==
& & pProperties->cBuffers = 1;
pProperties->cbBuffer = pvi->bmiHeader.biWidth *
pvi->bmiHeader.biHeight * 4;
& ALLOCATOR_PROPERTIES A
pAlloc->SetProperties(pProperties, &Actual);
& if (FAILED(hr))
& // Is this allocator unsuitable?
(Actual.cbBuffer cbBuffer)
& & & & return
& return S_OK;
HRESULT CBallStream::GetMediaType(int iPosition, CMediaType *pmt)
if (iPosition == 0) {
& & & & ASSERT (pmt) ;
pmt->InitMediaType();
& & & & pmt->SetType(&MEDIATYPE_Video);
& & & & pmt->SetSubtype(&MEDIASUBTYPE_H264);
////////设置outputpin的Format
& & & & VIDEOINFO *pvi = (VIDEOINFO *)
pmt->AllocFormatBuffer(sizeof(VIDEOINFO));
ZeroMemory(pvi,
sizeof(VIDEOINFO));
pvi->bmiHeader.biCompression = FOURCC_H264;
pvi->bmiHeader.biBitCount& & = 16;
pvi->bmiHeader.biSize& & & =
sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth& & & = 352;
pvi->bmiHeader.biHeight& & = 288;
pvi->bmiHeader.biSizeImage& =
GetBitmapSize(&pvi->bmiHeader);
& & & & 部分代码省略
其实,这些代码也是参照了其他的filter写的… 总感觉是这两个地方,哪里细节写得有点问题,但一直找不到原因?
最近调试的时候,发现FillBuffer(IMediaSample
*pSample)运行得怪怪的,是不是要控制FillBuffer()运行的速率?因为在FillBuffer里完成了对接收到的h.264
nalu的memcpy,个人觉得那是不是FillBuffer要和fps对应,比如:25fps的情况下,那么FillBuffer应该也是一秒钟被调用 25
次??…智能连接做了没,怎么做的?我的source filter for h264做好了,但是它不会智能连接谢谢大家的持续热力关注本帖!
再次重申一个事情:我们公司内部封QQ了,俺家里的电脑也没上网,晚上回家去偶尔用手机上上Q,也不太方便聊天.所以上面有留本人的QQ联系方式,暂时无法和大家联络!请各位见谅.
交流学习,请加我的MSN: pan_,加时请注明:CSDN,H.264等相关信息.
祝大家元旦快乐!新年更上一层楼啊!!
===================================================================
谢谢楼上的lhfiii大哥,我想我目前图像出现马赛克,可能还真是timestamp打的不对的原因?..
REFERENCE_TIME
rtStart = m_iFrameNumber * m_rtFrameL
REFERENCE_TIME rtStop& = rtStart
+ m_rtFrameL
pSample->SetTime(&rtStart, &rtStop);
这段代码是参考了PushSource根据FPS来打的时间戳.依据fps来计算时间戳打出来的是每一帧(frame)视频的时间戳,但实际上我在写H.264
Source filter的时候,FillBuffer里往后面filter推的IMediaSample是一个个的nalu,而后面decode
filter也是一个个nalu来解码的.那么nalu的timestamp肯定不能根据fps来计算,而是要根据编码端的那个tpresentationTime来设置时间戳了?
不知道我这样的理解是否正确?..请高手过来指正下!
另外,再想请问:
struct timeval tpresentationT
tpresentationTime.tv_sec
tpresentationTime.tv_usec
这个时间,我取到后,怎么转换成DShow里的REFERENCE_TIME?? 希望是"真正"的问题原因查出来了:
画面中动作幅度过大,导致视频马赛克的真正原因是丢帧.为什么会这样呢?
因为live555中的数据接收和fillbuffer是分别两个线程,线程之间是没有做同步的,而两个线程共享(共同处理)一个h.264的数据块指针.对于接收到的h.264
nalu数据块,程序设计上并没有做缓冲区的考虑,这个便是最大的问题.
BYTE* recevH264Data=NULL;
recH264Dataold=NULL;
CPushPinBitmapSet::FillBuffer(IMediaSample *pSample)
& & BYTE *pD
& & long cbD
if (recevH264Data!=recH264Dataold)
memcpy(pData,recevH264Data,bufLength);
& & recH264Dataold=recevH264D
& & 后面部分代码省略
live555中的数据接收线程:
& 部分代码省略
recevH264Data=pcbCompressedD
& bufLength=nCompressedL
后面部分代码省略
我的理解:当画面静止或运动量不大的情况下,每次recevH264Data一个包接收到的数据量不多,memcpy占用cpu的时间不长的情况下,两个线程之间同步不会出现太大的问题,基本上不会有明显的丢帧;但当画面中的动作幅度过大,recevH264Data一个包接收到的数据量超过6000bytes的情况下,memcpy运行的时间过长,就很可能导致两个线程之间无法同步,即fillbuffer执行一次数据量过大的memcpy时(即,画面中的大幅度动作),很可能live555中的数据接收线程已经跑过了5次或是8次(主要是取决于memcpy的时间长短),而live555中的数据接收线程又没有设计接收数据的缓冲区,所以中间的那5个或是8个数据包就丢掉了,fillbuffer并没有来得及处理,及时把nalu推出去,给后面的filter,这样就丢帧了!从而,视频图像上就会看到大面积的马赛克..
大虾们,不知道我的理解,对不对?
请高手过来帮我想想办法,设计一个数据缓冲区,"先进先出"的队列?
俺数据结构都忘得差不多了,学得太菜,现在不知道该如何解决这个问题…&
只要能保证live555中的数据接收线程接收到的每一个nalu,都能够copy给fillbuffer去处理,推给后面的decode
filter解码,我相信马赛克的这个问题就基本上可以迎刃而解了..我是楼主!再顶一下自己的帖子…
针对上面的问题,使用STL里的list,改写了小部分的代码.因为以前从没接触过STL,所以关于list的使用,可能还是有点问题,请高手帮下忙!
// List basics.
recevH264Data=NULL;
BYTE*& recH264Dataold=NULL;
list & // create an empty
HRESULT CPushPinBitmapSet::FillBuffer(IMediaSample *pSample)
& & BYTE *pD
& & long cbD
& & recevH264Data=*& & //不知道为什么程序执行到这里,就报内存访问错误?if
((recevH264Data!=recH264Dataold)&&(lstp!=lst.end()))
memcpy(pData,recevH264Data,bufLength);
& & recH264Dataold=recevH264D
& & *lstp=NULL;
& & lstp++;
& & 后面部分代码省略
live555中的数据接收线程:
extern list
extern list
& list ::iterator lstp =
lst.begin();
& 部分代码省略
& recevH264Data=pcbCompressedD
bufLength=nCompressedL
& lst.push_back(recevH264Data);&
& //目前暂时只保存了recevH264Data指针,实际上该指针对应的buffer长度bufLength也应该要保存.后续
//做成一个struct,一起用list再实现
& 后面部分代码省略
不知道为什么,程序执行到这句 recevH264Data=*
我在 fillbuffer 里F9设置断点,单步执行这里的时候,报错..
First-chance exception in graphedt.exe (PUSHSOURCE.AX): 0xC0000005: Access
Violation.
是不是因为live555中的数据接收线程跑得太快了,list 一直 push_back,不断的push,会不会溢出?? HRESULT CPushPinBitmapSet::FillBuffer(IMediaSample *pSample)
& & long cbD
& & //步骤没错吧?会不会lstp没赋值?list ::iterator lstp = lst.begin();
& recevH264Data=*
& if ((recevH264Data!=recH264Dataold)&&(lstp!=lst.end()))
& & memcpy(pData,recevH264Data,bufLength);
recH264Dataold=recevH264D
& & *lstp=NULL;
& & lstp++;
后面部分代码省略
live555的原型是单线程的,如果说有赋值的话,按理不大可能会是由于内存锁住而导致的。分析的很透彻啊
阅读(3184) | 评论(0) | 转发(0) |
上一篇:没有了
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 我是小菜鸟av发帖库 的文章

 

随机推荐