多媒体相关 – 涛哥的blog http://www.138soft.com Sat, 09 Nov 2013 13:09:39 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.2.2 http://www.138soft.com/wp-content/uploads/2018/03/cropped-timg-32x32.jpg 多媒体相关 – 涛哥的blog http://www.138soft.com 32 32 发布一个本站电影专用播放器 http://www.138soft.com/?p=294 http://www.138soft.com/?p=294#comments Sat, 09 Nov 2013 13:09:39 +0000 http://www.138soft.com/?p=294         本站经常介绍一些精彩经典的电影,其中有很多已经无法找到片源了,所以站长把自己机器上的老片上传到服务器了,为了配合电影的播放,专门提供了一个播放器。
这个播放器是几年前写的,实际上就是黑洞远程管理V2里面的媒体播放功能,现在是作了两个地方的小修改:一个是菜单那里添加了一个“观看网站电影”,点击后就可以选择播放本站介绍过的电影了。另外一个地方就是不用再安装对应的解码器了,程序全部集成在资源里面了,启动后这些解码器也不会释放到磁盘,而是直接内存注册加载COM,所以很绿色。不过也是因为这个缘故,程序体积有点大(解码器DLL之类差不多占用了10MB),虽然可以用UPX之类压缩一下,但为了避免杀毒说加壳,就没处理了。

httpplayer

        这个播放器唯一优点就是速度快,理论上拖动播放进度只需要0.1秒,不过因为本站服务器在美国,所以国内播放起来就慢了,如果片源在国内,那么0.1秒是肯定的。至于为什么那么快,网上已经有很多文章介绍了,这里就不啰嗦了。需要提醒的是,这个版本只支持mpg、dat、mp3、avi、asf、wmv、rm、rmvb和rm10格式,不支持其它例如mp4等格式,因为那时候mp4还没出现,找不到对应的解码器。
        程序本身叫HttpPlayer,但本质上应该叫FastMemoryMediaPlayer,因为它内部并不关心数据从何而来:可以是HTTP过来的、P2P过来的,或者本地磁盘读取的,只不过是我喜欢在服务器用迅雷下载电影(服务器下载一般只用1分钟),然后直接用它来播放,所以数据部分我直接走HTTP。实际上,以前很多点播站点都是用HTTP的,因为IIS的并发量很大。这样一来,开发者可以把精力放在解码上面,网络部分就用IIS和ISAPI Filter。有意思的是,几年前PPSTREAM就刚好相反,他们精力放在P2P网络部分,解码播放部分则简单的调用操作系统的Mediaplay的OCX,然后进程内HOOK了文件读写,表明上看,播放的是磁盘文件,实际上数据是从网络过来的。现在还有一种比较流行的是类似迅雷的云转码播放,原理就是服务器上先统一转换成FLV,然后再播放,这种做法优点在于对开发人员的技术水平不用要求很高,找个新生下个FFMPEG就能搞定,缺点就见仁见智了。个人是觉得转码太花时间和空间,不过对于迅雷这种多用户软件来说,例如现在流行一部热门电影,第一个用户下载的时候,服务器就给转码了,后面再点播的就不用再转了。
        点击这里下载程序。

]]>
http://www.138soft.com/?feed=rss2&p=294 5
用Delphi实现一套完整的多媒体直播系统 http://www.138soft.com/?p=284 http://www.138soft.com/?p=284#comments Sat, 09 Nov 2013 09:48:09 +0000 http://www.138soft.com/?p=284         上文介绍了如何用实现基于RTMP协议的多媒体直播系统,但是因为服务器和播放端都是第三方的,所以本文介绍一个从采集推送、服务器和播放端都是自己实现的系统。自己全部实现的优点就是全部可控,例如延迟可以控制在0.1秒。

        1、采集端。采集端跟前文的RTMP采集其实没有什么区别,但是有两个地方需要注意,一个就是视频压缩,因为我使用的H264是老版本的,这个版本要求视频的长和宽都必须是16的倍数,而对于视频文件来说,有些尺寸不一定能够满足,所以对于不满足条件的,我压缩强制了16位对齐(前文RTMP的H264我使用的是新版本的,所以不存在这个问题)。另外一个地方是音频压缩,我使用的是AAC,压缩的时候一定要注意输入的样本数量必须跟配置信息的一样,否则解压后播放起来会爆音。

live1

        2、服务器端。服务器端实现起来很简单,就是一个数据转发而已,我这里只是简单的写了一个:

live2

        3、播放端。播放端是继承自TSource的一个Filter,这个Filter有两个Pin,一个播放视频,一个播放音频。

live3

live4

        实际上,视频直播现在已经流行视频用D3D,音频用IAudioClient,播放起来更加清晰,实现起来也更加简单,不需要什么DirectxShow的知识。点这里下载演示程序,相关问题请加QQ群讨论,另外群共享里面也有一些相关的代码。

]]>
http://www.138soft.com/?feed=rss2&p=284 4
用Delphi实现基于RTMP协议的多媒体直播系统 http://www.138soft.com/?p=239 http://www.138soft.com/?p=239#comments Sat, 09 Nov 2013 09:10:39 +0000 http://www.138soft.com/?p=239         周末了,来一篇关于RTMP协议的东西。RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输 开发的开放协议。它有三种变种:

        1)工作在TCP之上的明文协议,使用端口1935;

        2)RTMPT封装在HTTP请求之中,可穿越防火墙;

        3)RTMPS类似RTMPT,但使用的是HTTPS连接;

        基于RTMP协议的直播系统一般由三部分组成:采集推送端(实现数据采集和发送)、服务器端(接收推送端数据,并传输给播放端)、播放端(从服务器端接收并播放)。服务器一般不用自己写,因为开源和商业的都非常多,简单列举如下:

一、开源项目

项目名称        开发语言        项目地址

red5                   Java           http://code.google.com/p/red5/
crtmpserver      C++           http://www.rtmpd.com
ErlyVideo          erlong        https://github.com/erlyvideo/erlyvideo
haXeVideo       haXe           http://code.google.com/p/haxevideo/
FluorineFx       .NET            http://www.fluorinefx.com/

二、商业程序

程序名称                                     所属公司                                                  地址
FMS                                               Adobe                                           http://www.adobe.com/products/flash-media-server-family.html
Wowza Media Server                 Wowza Media Systems             http://www.wowza.com/media-server
Helix                                             Real Network                               http://www.realnetworks.com/helix/streaming-media-server/
Evostream Media Server          EvoStream                                   http://www.evostream.com/

        当然,还有一些其他的开源、商业rtmp服务器(如ffserver),就不一一列举了。一般来说,商业rtmp程序要比开源程序支持更多的协议以及更多的平台。

        虽然Adobe也在官方网站已经提供了RTMP协议的官方文档,但根据网上实际开发过的人写的文章说:“Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的”。幸好有个开源项目RTMPDUMP(http://rtmpdump.mplayerhq.hu/),RTMPDump是一个匈牙利人的作品。他在Adobe未公开RTMP协议的条件下,写出了针对RTMP协议的客户端程序。他和Adobe的故事,大家也可以在网上看看。后来又有个叫Faris Khowarizmi的人写了针对librtmp(RTMPDump的核心Dll)的Delphi头文件paslibrtmp,所以现在使用Delphi来开发就方便多了。不过他翻译的文件中有一个结构翻译错误了,具体是TRTMPPacket结构里面的m_hasAbsTimestamp,他定义为DWORD类型了,实际上应该是BYTE类型,这个如果错误的话,则后面会全部错误。

        下面说一下推送流程:
        1、采集视频和音频数据,然后编码。我这里是使用H264压缩视频,AAC压缩音频。
        2、连接RTMP服务器,发送视频(如果有)的初始信息和音频的初始化信息。例如:视频的大小、音频的频率声道之类。
        3、循环把第一步的数据发送给RTMP服务器。
        最后效果如下:
        推送端:
rtmp1
        播放效果:
rtmp2

        经过实际测试,RTMP协议在互联网的话延迟大概在2秒左右,局域网的话则延迟不大。点这里下载paslibrtmp,点这里下载演示程序,相关问题请加QQ群讨论,另外群共享里面也有一些相关的代码。

]]>
http://www.138soft.com/?feed=rss2&p=239 12