自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 ijkplayer-android框架详解

ijkplayer是一个基于ffplay的轻量级Android/iOS视频播放器,实现了跨平台的功能,API易于集成;编译配置可裁剪,方便控制安装包大小。本文重点分析其C语言实现的核心代码,涉及到不同平台下的封装接口或处理方式时,均以Android平台为例。一、FFplay源码流程图由于ijkplayer底层是基于ffplay的,首先需要了解ffplay的代码处理流程。FFplay是F

2018-01-28 16:42:39 23233 1

原创 SRS 代码分析【保存MP3音频文件】

1. SRS 对MP3音频文件的保存首先调用SrsMp3Transmuxer::write_header()写入头部信息,函数定义如下:int SrsMp3Transmuxer::write_header(){ char id3[] = { (char)0x49, (char)0x44, (char)0x33, // ID3 (char)0x03, (

2017-12-13 14:13:09 1898

原创 SRS 代码分析【保存AAC音频文件】

SRS 对AAC音频文件的保存主要是调用SrsAacTransmuxer::write_audio(),函数定义如下:int SrsAacTransmuxer::write_audio(int64_t timestamp, char* data, int size){ int ret = ERROR_SUCCESS; srs_assert(data);

2017-12-13 13:12:51 1402

原创 SRS 代码分析【RTMP Chunck数据发送】

1.RTMP 发送数据时会调用SrsProtocol::do_send_and_free_packet,该函数定义如下:int SrsProtocol::do_send_and_free_packet(SrsPacket* packet, int stream_id){ int ret = ERROR_SUCCESS; srs_assert(packet);

2017-12-11 16:12:31 1006

原创 SRS 代码分析【RTMP Chunck数据读取】

1.RTMP Chunck流读取主要是调用SrsProtocol::recv_interlaced_message,该函数的定义如下:int SrsProtocol::recv_interlaced_message(SrsCommonMessage** pmsg){ int ret = ERROR_SUCCESS; // chunk stream basic hea

2017-12-11 14:38:30 2125

原创 SRS 代码分析【RTMP握手实现】

RTMP简单握手实现1.客户端握手的代码如下:int SrsSimpleHandshake::handshake_with_server(SrsHandshakeBytes* hs_bytes, ISrsProtocolReaderWriter* io){ int ret = ERROR_SUCCESS; ssize_t nsize; //

2017-12-11 10:28:00 2186

转载 SRS 代码分析【RTMP信息play/publish】

转载:SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP信息Publishhttp://blog.csdn.net/ManagerUser/article/details/73614518SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息playhttp://blog.csdn.

2017-12-10 21:25:36 1476

原创 SRS 代码分析【DVR录像实现】

DVR配置详解:https://github.com/ossrs/srs/wiki/v3_CN_DVR1.SrsOriginHub::initialize初始化时会调用SrsDvr::initializesrs_error_t SrsDvr::initialize(SrsOriginHub* h, SrsRequest* r){ srs_error_t err = s

2017-12-10 20:54:09 6907

转载 RTMP协议详解

转载:http://blog.csdn.net/shangmingyang/article/details/50837852RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。随着VR技术的发展,视频

2017-12-10 17:29:46 481

转载 SRS 代码分析【转发流实现】

SRS 代码分析【转发流实现】转载:http://lib.csdn.net/article/liveplay/50671publish的流和play的流怎么连接呢?这个恐怕是最绕的地方了。看了一上午的代码,淹没于各种数据结构与流程之中后,俺终于发现了连接publish和play的关键连个类是SrsSourceSrsConsumer负责连接着连个类实例

2017-12-10 16:39:59 3101

原创 SRS 代码分析【mpeg-ts解析】

SRS 代码分析【mpeg-ts解析】1.SrsTsContext的decode接口定义如下:int SrsTsContext::decode(SrsBuffer* stream, ISrsTsHandler* handler){ int ret = ERROR_SUCCESS; // parse util EOF of stream. // for e

2017-12-10 15:29:06 3716

转载 rtmp流转Hls流 与 flv转mpegts

转载:http://lib.csdn.net/article/liveplay/39906rtmp协议是adobe出的一种流媒体格式协议。是目前较为流行的协议的一种。HLS协议是苹果推出的一种流媒体协议,由于IOS系统不支持RTMP协议,如实现RTMP协议的流媒体需要自己实现RTMP的客户端,这使得移动手机端使用RTMP的流媒体增加了一些开发成本。H

2017-12-08 15:55:33 2492

原创 Darwin流媒体服务器代码分析

Darwin Streaming Server(即DSS)是Apple公司提供的开源实时流媒体播放服务器程序。整个程序使用C++编写,在设计上遵循高性能,简单,模块化等程序设计原则,务求做到程序高效,可扩充性好。并且DSS是一个开源的基于标准的流媒体服务器,可以运行在Windows NT和Windows 2000,以及几个UNIX实现上,包括Mac OS X,Linux,FreeBSD和Solar

2017-12-04 20:49:03 635

原创 SRS 代码分析

SRS 代码分析1.SRS 代码分析【服务器启动】2.SRS 代码分析【RTMP连接请求响应】3.SRS 代码分析【FLV文件解析】4.SRS 代码分析【HTTP-FLV传输实现】5.SRS 代码分析【HLS切片】

2017-12-04 20:27:58 3834

转载 SRS 代码分析【HLS切片】

转载:http://blog.csdn.net/ManagerUser/article/details/76087151一、前言        SRS流媒体服务器支持rtmp协议,但是rtmp协议仅仅支持PC直播。移动端直播需要HLS协议,HLS协议是苹果公司开发出来的,用于移动端视频直播,Android也对HLS做了友好支持。所以,SRS流媒体服务器支持rtmp协议和hls协

2017-12-04 11:01:38 3026

原创 SRS 代码分析【HTTP-FLV传输实现】

http-flv技术实现:HTTP协议中有个约定:content-length字段,http的body部分的长度服务器回复http请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了,如果服务器回复http请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的socket连接断开。http-flv直播就是利用第二个原理,服务器回复客户

2017-11-27 13:11:49 4410

原创 SRS 代码分析【FLV文件解析】

FLV文件的结构SRS对FLV文件的解析实现1.FLV头部解析header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:文件类型3 bytes“FLV”版本1 byte一般为0x01流信息1 byte倒数第一位是1表示有视频,倒数第三位是1表示有音频,倒数第二、

2017-11-26 19:01:43 1404

转载 DSS 代码分析【RTSP announce推流报文分析】

Darwin流媒体服务器支持客户端推流到服务器端,服务器端再将推流转发到请求该流的客户端列表里。一,客户端推流过程ANNOUNCE->SETUP->PLAY->RTP/RTCP->TEARDOWN交互报文请参照,转载: http://blog.csdn.net/xiejiashu/article/details/51166196#C->S:#time: ms=47535025

2017-11-24 20:55:22 2381

原创 DSS 代码分析【reflector反射之推流转发分析】

客户端使用RTP over RTSP方式推流(annouce-->setup-->play)给DSS 服务器进行流转发流程如下:1. 当有RTSP请求消息到来时,相应的RTSPSession会被加入的TaskThread线程队列中等待执行,接着RTSPSession::Run()会被调用。在RTSPSession::Run()状态机跳转中kReadingReques

2017-11-24 20:45:49 739

原创 DSS 代码分析【RTP over tcp实现】

Darwin流媒体服务器RTP包可以通过 RTSP TCP channel进行传输。1.调用RTPStream::Write发送RTP包时,会判断是否使用TCP的方式进行传输,使用TCP传输时调用InterleavedWriteif (fTransportType == qtssRTPTransportTypeTCP) // write out in interleave forma

2017-11-24 12:01:44 625

原创 EasyDarwin 中使用epoll网络模型替换原来的select模型

由于select最大只支持1024个文件描述符,原因#define __FD_SETSIZE 1024,随着使用的fd增加,处理性能上也会下降。下面是easydarwin中epoll的封装#include "epollEvent.h"#include #include #include #include "OSMutex.h"using namespace std;#if d

2017-11-22 21:12:49 694 4

转载 H.264视频流的传输与载荷

转载:http://blog.csdn.net/bytxl/article/details/50393198从摄像头获取的视频数据,经过编码后(当然,也可以不编码,如果你觉得也很ok的话),可以视频录制,同时如果需要,当然也可以视频远程传输咯,而实时传输协议(Real-time Transport Protocol,RTP)是在Internet上处理多媒体数据流的一种网络协议,利用它能

2017-11-22 20:51:33 488

原创 DSS 代码分析【SR包发送】

Darwin 流媒体在发送RTP时会定期的发送SR发送端报告,具体调用过程如下SR发送的函数具体实现如下:void RTPStream::SendRTCPSR(const SInt64& inTime, Bool16 inAppendBye){ // This will roll over, after which payloadByteCount will be all messed

2017-11-22 15:54:57 587

原创 DSS 代码分析【BufferWindow实现】

Darwin 流媒体服务器可以根据客户端BufferWindow的大小,动态控制发包的速度;客户端需要设定BufferWindow,并通过RTCP包定期将当前可用BufferWindow大小告诉服务器。服务器端实现流程如下:1.服务器端有个RTCPTask的任务会在TaskThread的线程里一直执行,接收客户端发送过来的RTCP包,并调用ProcessIncomingRTCPPacket

2017-11-22 15:37:43 415

原创 DSS 代码分析【Reliable UDP之拥塞控制】

Darwin流媒体服务器中拥塞控制是在RTPBandwidthTracker类中定义并实现的。1.在服务器启调用 RTPSession::Play给客户端播送音视频数据时,会调用RTPBandwidthTracker::SetWindowSize给拥塞窗口fCongestionWindow设定初值,fCongestionWindow是会动态变化的。void RTPBandwidthTrac

2017-11-22 11:57:39 481

原创 DSS 代码分析【Reliable UDP之超时时间计算】

Darwin流媒体服务中使用Karn算法来评估RTP传输超时时间,具体实现在RTPBandwidthTracker::AddToRTTEstimate函数中,具体代码如下:void RTPBandwidthTracker::AddToRTTEstimate(SInt32 rttSampleMSecs){ // qtss_printf("%d ", rttSampleMSecs); //

2017-11-22 10:56:57 527

原创 DSS 代码分析【Reliable UDP之数据重传】

Darwin 流媒体服务器支持使用Reliable UDP的方式发送RTP,Reliable UDP使用数据重传和拥挤控制算法,与TCP协议采取的算法类似。在使用Reliable UDP发送RTP数据时调用RTPStream::ReliableRTPWrite,具体实现如下:QTSS_Error RTPStream::ReliableRTPWrite(void* inBuffer, UIn

2017-11-21 21:04:51 646

原创 DSS 代码分析【学习资料分享】

一个采集手机视频数据,通过RTSP协议进行发布的Android开源项目https://github.com/fyhertz/spydroid-ipcamera一个全面介绍Darwin 流媒体服务器的文章http://www.wisestudy.cn/opentech/darwin-quickTime.html

2017-11-20 21:02:55 1650

原创 DSS 代码分析【RTSP消息交互过程】

RTSP消息交互过程:c->s【向服务器请求SDP信息】【DESCRIBE】    DESCRIBE rtsp://211.94.164.220/3.3gp RTSP/1.0【交互标识】       CSeq: 1【请求内容】       Accept: application/sdp【用户标识】       User-Agent:01056SS6800111761602210

2017-11-20 20:43:46 744

原创 DSS 代码分析【点播请求】

点播请求:RTSP连接建立客户端发起点播请求,触发服务器的建立RTSP连接事件针对RTSP协议,Darwing Streaming Server在554端口上侦听,当有连接请求到达时,通过accept调用返回一个socket,对应的后续RTSP请求都是通过这个socket来传送的。我们把RTSP相关的事件分成两类,一类是RTSP连接请求,一类是RTSP请求。先来看RTSP连

2017-11-20 19:52:12 994

原创 DSS 代码分析【TimeoutTask】

从代码中看,TimeoutTaskThread是IdleTask的派生类,分析后发现从TimeoutTaskThread与IdleTask没有任何关系,完全可以从Task派生。因此TimeoutTaskThread就是一个普通的Task,TimeoutTaskThread通过其Run方法监控一组超时任务,具体的比如RTSP协议或者RTP协议超时。在系统启动的时候TimeoutTas

2017-11-20 19:47:10 558

原创 DSS 代码分析【TaskThread与Task】

TaskThread::Entry调用TaskThread::WaitForTask()方法获得下一个需要处理的Task。TaskThread::WaitForTask()首先从TaskThread::fHeap中获得Task,如果TaskThread::fHeap中没有满足条件的Task,则从TaskThread::fTaskQueue中获得Task。TaskThread::Entr

2017-11-20 19:44:49 423

原创 DSS 代码分析【EventThread与EventContext】

u系统启动的时候调用QTSServer::StartTasks()把RTSP服务端口加入到侦听队列中。此时便开始接收客户端的RTSP连接请求了。u在EventThread::Entry中调用select_waitevent函数等待事件的发生,当有事件发生的时候,就通过调用ProcessEvent方法对事件进行相应的处理。注意ProcessEvent是一个虚函数,共有两个实现。Event

2017-11-20 19:42:08 487

原创 DSS 代码分析【服务器架构】

DSS流媒体服务器是由一个父进程构成的,这个父进程分叉出一个子进程,该子进程就是核心服务器。父进程会等待子进程的退出。如果子进程错误退出,则父进程就会分叉出一个新的子进程。核心服务器的作用是充当网络客户和服务器模块的接口,其中网络客户使用RTP和RTSP协议来发送请求和接收响应,而服务器模块则负责处理请求和向客户端发送数据包。DarwinSt

2017-11-20 19:35:53 1430

原创 DSS 代码分析【启动、初始化流程】

DSS加载module及和module交互的流程,如下:(1)、DSS在fork子进程后调用StartServer启动服务              调用OS、OSThread、Socket、SocketUtils、QTSSDictionaryMap、              QTSServerInterface、QTSServer等类的Initialize函数进行初始化。

2017-11-20 19:19:33 987

原创 SRS 代码分析【RTMP连接请求响应】

rtmp服务端口监听:1).获取配置文件中设定的端口列表 _srs_config->get_listens()2).释放掉已经监听rtmp端口 close_listeners(SrsListenerRtmpStream)3).根据端口列表创建SrsListener实例,并启动监听listener->listen(ip, port))srs_error_t SrsServer::li

2017-11-20 09:39:53 2992

原创 SRS 代码分析【服务器启动】

服务器启动流程:main函数中直接调用do_main函数do_main函数执行过程如下:1).解析输入参数 _srs_config->parse_options()2).初始化log  srs_log->initialize()3).启动服务器 run(SrsServer*)run函数执行流程如下:1).初始化SrsServer类 svr->initiali

2017-11-20 09:33:19 2411

原创 Android 使用librtmp推流【音视频传输】

1.通过jni调用librtmp下面是jni中提供调用的本地方法:public final class PublishJni { static { System.loadLibrary("publish"); } static native long init(String url, int w, int h, int timeOut);

2017-11-19 22:39:34 2743 6

原创 Android 使用librtmp推流【视频YUV格式转化】

YUV420P

2017-11-19 22:15:58 941

原创 Android 使用librtmp推流【音视频编码模块】

视频编码部分:1.视频编码模块通过接口initVideoEncoder用来初始化视频编码器。2.通过调用startVideoEncode()开始视频编码。startVideoEncode()中开启视频编码线程,编码线程中调用byte[] data = videoQueue.take()来获取待编码的数据,videoQueue中的数据是在RtmpPublish

2017-11-19 21:44:33 843

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除