【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink

129 篇文章 137 订阅 ¥69.90 ¥99.00
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常抱歉,之前的回答中的代码仍然有错误。以下是经过修正的代码,已经将 ServerMediaSession 的名称修改为 "stream",并将 RTSP URL 改为 `rtsp://127.0.0.1:8554/stream`: ```cpp #include <liveMedia/liveMedia.hh> #include <BasicUsageEnvironment/BasicUsageEnvironment.hh> #include <Groupsock/GroupsockHelper.hh> class VideoSource : public FramedSource { public: static VideoSource* createNew(UsageEnvironment& env) { return new VideoSource(env); } void setVideoData(char* data, unsigned int length) { fFrameSize = length; memcpy(fTo, data, length); fFrameCount++; if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { gettimeofday(&fPresentationTime, NULL); } } private: VideoSource(UsageEnvironment& env) : FramedSource(env), fFrameSize(0), fFrameCount(0) { gettimeofday(&fPresentationTime, NULL); } virtual ~VideoSource() {} virtual void doGetNextFrame() { if (fFrameSize > 0) { // 创建一个新的帧 if (fFrameCount > 0) { // 计算下一帧的时间戳 fPresentationTime.tv_usec += 33333; // 每帧33毫秒(30帧每秒) if (fPresentationTime.tv_usec >= 1000000) { fPresentationTime.tv_sec++; fPresentationTime.tv_usec -= 1000000; } } // 发送帧数据给客户端 FramedSource::afterGetting(this); } else { // 数据还未准备好,等待100毫秒后再次尝试获取帧数据 envir().taskScheduler().scheduleDelayedTask(100 * 1000, (TaskFunc*)doGetNextFrame, this); } } virtual void doStopGettingFrames() {} private: unsigned int fFrameSize; unsigned int fFrameCount; }; int main(int argc, char** argv) { // 创建一个 RTSP 服务器环境 TaskScheduler* scheduler = BasicTaskScheduler::createNew(); UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554); // 创建一个 RTSP 流媒体服务器 ServerMediaSession* sms = ServerMediaSession::createNew(*env, "stream", "Live stream"); // 添加视频源 VideoSource* videoSource = VideoSource::createNew(*env); H264VideoStreamFramer* videoStreamFramer = H264VideoStreamFramer::createNew(*env, videoSource); sms->addSubsession(PassiveServerMediaSubsession::createNew(*videoStreamFramer)); rtspServer->addServerMediaSession(sms); // 启动 RTSP 服务器 env->taskScheduler().doEventLoop(); // 清理资源 Medium::close(rtspServer); env->reclaim(); delete scheduler; return 0; } ``` 非常抱歉之前的错误带来的困扰,感谢您的耐心和理解。如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值