资源简介
一个小工具,将TS流文件发送到以太网络上。
支持使用UDP或者RTP协议。
根据TS流的PCR值跟踪时间同步发送。
我用的GetTickCount进行发送时间同步,线程按照10毫秒进行轮回,按照Win32系统普通线程切换时间,应该可以保证到10毫秒左右的同步精度。
但听人提过使用GetTickCount进行时间同步,长时间会有时间漂移现象,而且误差会逐渐累加,直到客户端缓冲溢出。对方提出的解决方案是使用GPS卫星时间同步...
个人以为GetTickCount是使用Win32底层的某个高精度时间结果。在微观上不是很精确,但是宏观上应该是很精确。
我实际曾经使用这个工具,发送过同一个文件三天三夜,客户端使用VideoLan进行在线播放,缓冲设置300ms,没有发现VideoLan缓冲有溢出的情况。
如果这种同步方式,长时间发送,确实有精度问题,希望有同志给出例证和解决方案(除了使用GPS卫星时间以外的方案...)。以便我改进。
demo中根据以太网通常的MTU值直接按7个TS包进行封装:
SetGetTsPacketDataCB(GetTsPacketData, NULL, TS_PACKET_SIZE_MIN*7);
如果是其他网络类型,需要根据网络的MTU值调整TS包数量。
代码片段和文件信息
#include “stdafx.h“
#include “Rtp.h“
static const UINT16 RTP_HEADER_SIZE = 12;
static const UINT16 RTP_H263_HEADER_SIZE = 2;
Rtp::Rtp(UINT mtu) :Udp(mtu)
{
m_SequenceNumber = 0;
}
Rtp::~Rtp()
{
}
int Rtp::Read(BYTE* pBuffer UINT16 bufferSize INT8* pPayloadType UINT16* pSequenceNumber INT32* pTimeStamp INT32* pSsrc UINT nTimeOut)
{
int iRead;
UINT8 payloadType;
UINT16 sequenceNumber;
INT32 timeStamp;
INT32 ssrc;
m_RtpPacket.ExtendBuffer(bufferSize+RTP_HEADER_SIZE);
m_RtpPacket.ClearData();
iRead = Udp::Read(m_RtpPacket.m_pBuffer m_RtpPacket.m_nBufferSize nTimeOut);
if (iRead < 12)
return -1;
if (!ParseRtpHeader(m_RtpPacket.m_pBuffer &payloadType &sequenceNumber &timeStamp &ssrc))
return -1;
m_RtpPacket.m_nDataSize = iRead;
memcpy(pBuffer m_RtpPacket.m_pBuffer + RTP_HEADER_SIZE iRead - RTP_HEADER_SIZE);
if (pPayloadType)
*pPayloadType = payloadType;
if (pSequenceNumber)
*pSequenceNumber = sequenceNumber;
if (pTimeStamp)
*pTimeStamp = timeStamp;
if (pSsrc)
*pSsrc = ssrc;
return iRead - RTP_HEADER_SIZE;
}
int Rtp::Write(PBYTE pBuffer UINT16 bufferSize INT8 payloadType INT32 timeStamp INT32 ssrc BOOL marker UINT nTimeOut)
{
int iWrite;
CreateRtpPacket(pBuffer bufferSize payloadType timeStamp ssrc marker);
iWrite = Udp::Write(m_RtpPacket.m_pBuffer m_RtpPacket.m_nDataSize nTimeOut);
if (iWrite < RTP_HEADER_SIZE)
return -1;
return iWrite - RTP_HEADER_SIZE;
}
void Rtp::CreateRtpPacket(PBYTE pData UINT16 dataSize UINT8 nPayloadType INT32 timeStamp INT32 nSSRC BOOL marker)
{
m_RtpPacket.ExtendBuffer(RTP_HEADER_SIZE + dataSize);
m_RtpPacket.ClearData();
m_RtpPacket.m_pBuffer[0] = 0x80;
m_RtpPacket.m_pBuffer[1] = (marker?0x80:0x00)|nPayloadType;
m_RtpPacket.m_pBuffer[2] = ( m_SequenceNumber >> 8 )&0xff;
m_RtpPacket.m_pBuffer[3] = m_SequenceNumber&0xff;
m_RtpPacket.m_pBuffer[4] = (BYTE)( timeStamp >> 24 )&0xff;
m_RtpPacket.m_pBuffer[5] = (BYTE)( timeStamp >> 16 )&0xff;
m_RtpPacket.m_pBuffer[6] = (BYTE)( timeStamp >> 8 )&0xff;
m_RtpPacket.m_pBuffer[7] = (BYTE)timeStamp&0xff;
m_RtpPacket.m_pBuffer[ 8] = ( nSSRC >> 24 )&0xff;
m_RtpPacket.m_pBuffer[ 9] = ( nSSRC >> 16 )&0xff;
m_RtpPacket.m_pBuffer[10] = ( nSSRC >> 8 )&0xff;
m_RtpPacket.m_pBuffer[11] = nSSRC&0xff;
m_SequenceNumber++;
m_RtpPacket.m_nDataSize = RTP_HEADER_SIZE;
m_RtpPacket.AppendData(pData dataSize);
}
BOOL Rtp::ParseRtpHeader(PBYTE pRtpHeader UINT8* pPayloadType UINT16* pSequenceNumber INT32* pTimeStamp INT32* pSsrc)
{
if (pRtpHeader[0] != 0x80)
return FALSE;
*pPayloadType = pRtpHeader[1];
*pSequenceNumber = ((WORD)pRtpHeader[2]) << 8 | pRtpHeader[3];
*pTimeStamp = (INT32)pRtpHeader[4] << 24 | (INT32)pRtpHeader[5] << 16 | (INT32)pRtpHeader[6] << 8 | pRtpHeader[7];
*pSsrc = (INT32)pRtpHeader[8] << 24 | (INT32)pRtpHeader[9] << 16 | (INT32)pRtpHeader[10] << 8 | pRtpHeader[11];
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1226 2009-08-25 15:15 SendTs2Ip\ReadMe.txt
文件 3017 2009-03-24 14:53 SendTs2Ip\Rtp.cpp
文件 780 2009-03-24 14:55 SendTs2Ip\Rtp.h
文件 3376 2009-09-30 17:04 SendTs2Ip\SendTs2Ip.cpp
文件 4702 2009-08-25 15:19 SendTs2Ip\SendTs2Ip.dsp
文件 541 2009-08-25 15:15 SendTs2Ip\SendTs2Ip.dsw
文件 883 2009-08-25 15:56 SendTs2Ip\SendTs2Ip.sln
文件 6983 2009-08-25 18:24 SendTs2Ip\SendTs2Ip.vcproj
文件 1427 2009-10-21 13:37 SendTs2Ip\SendTs2Ip.vcproj.SB-4198B7C3284E.cc.user
文件 3867 2009-04-02 14:31 SendTs2Ip\Socket.cpp
文件 1093 2009-04-02 14:32 SendTs2Ip\Socket.h
文件 6587 2009-08-25 17:51 SendTs2Ip\SourceTsFile.cpp
文件 1418 2009-08-25 15:57 SendTs2Ip\SourceTsFile.h
文件 296 2009-08-25 15:15 SendTs2Ip\StdAfx.cpp
文件 936 2009-08-25 16:42 SendTs2Ip\StdAfx.h
文件 2412 2009-08-07 10:11 SendTs2Ip\string_t.h
文件 738 2009-01-19 17:35 SendTs2Ip\TLock.h
文件 4148 2008-07-29 17:48 SendTs2Ip\Udp.cpp
文件 531 2009-04-02 12:03 SendTs2Ip\Udp.h
文件 8526 2009-08-25 11:46 SendTs2Ip\VBuffer.h
文件 2249 2008-05-26 12:20 SendTs2Ip\VBufferT.h
目录 0 2009-11-27 14:57 SendTs2Ip
----------- --------- ---------- ----- ----
55736 22
- 上一篇:基于CSerialPort修改类的串口调试助手源代码
- 下一篇:广工数据库课设报告
相关资源
- OnlineTestSystem.7z
- Qt_Opencv_Camera.rar
- Simple Apocalypse - Cartoon Assets v1.21
- Elemental Magic Vol.2 The Technique of Special
- Operating System Concepts(10th) 无水印原
- potatsolite.zip
- STM32F401 驱动LPS25HB气压传感器 HTS2
-
Remob
jects Remoting SDK for Delphi - 9.0.97 - 全国所有省市区县地图json
- The Elements of Statistical Learning 2nd 带书签
- echarts4.2.1源码包
- Springboot商城后台管理系统
- 麦子网bootstrap综合实战代码
- 海康webcomponents最新版64位,32位内附各
- 高清彩版 Bootstrap 4 Site Blueprints(2nd)
- 一个应用中启动另一个应用程序
- struts2+hibernate网上书店
- CISSPOfficial(ISC)2PracticeTestsSecondEdit
- Experiments Planning Analysis and Optimization
- struts2 权威指南完整版PDF
- SSH选课系统入门学习
- 基于Struts2、hibernate、spring实现的新闻
- spring3+hibernate4+struts2 ssh
- 摩托罗拉XTS5000说明书英文版
- DTS-HD_播放器_2_0_22(含破解)
- bootstrap基础教程对应源码
- junper isg1000防火墙升级包 6.2.0r5
- Data Mining: Concepts and Techniques 3rd 英文第
- 十二套响应式网站模板源代码
- bootstrapv3.zip
评论
共有 条评论