为Darwin Streaming Server扩展TS文件格式支持

众所周知,达尔文只支持mp4,3gp,mov等有限几种格式,连国内使用非常广泛的TS文件格式都不支持,实在是一种缺憾。
我跟列位一样,最近一年以来都有心想扩展ts格式,但一直畏惧自己才疏学浅,在鼎鼎大名的达尔文身上动刀子,有种自不量力之感!
网上看过最有用的一篇文章是这位仁兄的:
http://blog.sina.com.cn/s/blog_6a4c492f0100pffv.html

这篇文章很有用,但我发现最有用的还是Darwin Streaming Server源码中的子模块QTSSRTPFileModule,最具有参考意义:DarwinStreamingSrvr6.0.3-Source\APIModules\QTSSRTPFileModule,该模块支持.rtp后缀的文件格式,非常具有参考意义!!!而我们的目的只是增加.ts后缀的文件格式支持。
以下是我的实现步骤:
第一步:全盘拷贝QTSSRTPFileModule目录,然后修改QTSSRTPFileModule为QTSSTSFileModule,把【文件名】和【文件内容】中的”QTSSRTPFile”全部替换为”QTSSTSFile”(这里替换的字符串不能再短了)。
还有,记得把关键的字符串”.rtp” 替换为”.ts”
第二步:修改TSFileSession.cpp,TSFileSession.h这2个文件中的逻辑,这些逻辑主要涉及读取文件,文件seek,packet封包处理等的逻辑,这就需要熟悉TS文件的特点了,可以参考ffmpeg中的源码或者ts文件的rfc参考。
我建议您阅读ffmpeg中的源码文件会更直观:mpegts.c, rtpenc.c, mpegtsenc.c, 这样您就可以熟悉mpegts的封包格式以及rtp的封包格式。在此基础上,查看rtp的rfc文档等。

一句话,这一步主要任务是看懂原有的模块QTSSRTPFileModule的关于读写文件的逻辑,RTP包,时间戳,rtp格式等等。然后仿照其原有逻辑,构造自己的TS文件读取,生成SDP格式串,打包为rtp的逻辑!

提醒您一下:ts流只有一个rtsp track!而例子中的RTPFile是可以有多个track的,这在你构造SDP的时刻要注意一下。
建议增加自己的日志,建议您写单独的日志到单独的文件,文件路径为:/var/streaming/log/QTSSTSFileModule.log, 达尔文对该日志目录有写的权限哦!

第三步:加载新增模块到系统中,DarwinStreamingSrvr6.0.3-Source\Server.tproj\QTSServer.cpp
增加头文件:
#include “QTSSTSFileModule.h”
找到函数:void QTSServer::LoadCompiledInModules(),在函数尾部增加一下行:

QTSSModule* theTSFileModule = new QTSSModule(“QTSSTSFileModule”);
(void)theTSFileModule->SetupModule(&sCallbacks, &QTSSTSFileModule_Main);
(void)AddModule(theTSFileModule);

第四步:修改编译脚本Buildit和Makefile.POSIX文件,增加模块路径和模块文件,开始编译./Buildit

第五步:./Install, 运行调试,建议增加自己的日志,建议您写单独的日志到单独的文件,文件路径为:/var/streaming/log/QTSSTSFileModule.log, 达尔文对该日志目录有写的权限!
可以在客户端安装VLC播放器,调试rtsp
可以网上下载TS合成工具tsMuxeR,生成测试片源TS流。

要知道,从VLC能看到第1帧视频非常重要,看到了,说明您已经成功了80%了!!期间您可能需要wireshark抓包,如果是本地的虚拟机,您还需要RawCap这个windows抓包工具,抓本地包很牛叉!

我由于准备工作比较充分,只花了2周时间从编码到调试,完全实现了TS流的支持(包括10M以上的码流支持)。相信自己!赶快动手!

问我要源码?公司机密,无可奉告!但我的方法毫无隐瞒。

回复

你的邮件地址不会被公开(Your email address will not be published.) Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>