录播服务器产品OEM定制开发

本工作室提供音视频录播服务器产品OEM贴牌定制开发服务,欢迎有录播服务器需求的公司洽谈合作开发。







三棵杏IPC录播服务器用户使用手册

三棵杏IPC录播服务器产品信息

gstreamer从包含RTP的pcap文件提取视频保存mp4文件(文件由wireshark抓取)

好不容易从stackoverflow网站找到通过gstreamer从rtp抓包文件中提取视频的方法,命令如下:

gst-launch-1.0.exe filesrc location=183.215.100.4_send_h264_rtp2.pcap ! pcapparse dst-port=3002 ! application/x-rtp,media=video,clock-rate=90000,payload=109,encoding-name=H264 ! rtpjitterbuffer ! rtph264depay ! capsfilter caps="video/x-h264,width=1280,height=720,framerate=(fraction)25/1" !  h264parse ! mp4mux name=muxer ! filesink location=./test1.mp4

参数说明:
location=183.215.100.4_send_h264_rtp2.pcap为WireShark抓的网络包,包含有rtp流。
rtp端口为:pcapparse dst-port=3002
rtp流的参数为:application/x-rtp,media=video,clock-rate=90000,payload=109,encoding-name=H264
本地文件格式为mp4:mp4mux name=muxer
保存本地[......]

阅读全文

AAC raw包增加ADTS头

AAC原始码流无法直接播放,一般需要封装为ADTS格式才能再次使用,本博主在android中用MediaCodec编码得到的AAC就是raw格式,为了保存为.aac格式,需要增加adts头,这样就可以通过vlc或者windows Media player直接播放了。现在把网上搜集的资料和代码总结一下,以备自己以后参考,也分享给有需要的同仁。

源码来自:

http://stackoverflow.com/questions/18862715/how-to-generate-the-aac-adts-elementary-stream-with-android-mediacodec

实现函数:

::CO[......]

阅读全文

本软件工作室承接基于ffmpeg的二次开发软件项目

可提供转码,流媒体录制, m3u8切片, HLS直播, 音视频解码播放等相关开发。

项目金额 10000 RMB起。具体金额具体商谈,联系方式请点链接

1. libRtspClient Demo下载测试:
RTSP/RTMP流媒体播放库,可支持边录制,边播放。采用多线程支持多任务拉流。底层采用live555和ffmepg最新版本,可轻易支持android等平台。
RTSP支持onvif的用户密码认证。
编解码目前支持:视频支持H264,H265, 音频支持aac。
Windows下demo程序下载

2. Android下demon已可下载测试, 目前仅支持arm硬件架构,android[......]

阅读全文

Live555性能优化实践

网上很多文章提到了Live555的单线程任务调度模式,在用作RTSP服务时,导致了在并发量较多或者磁盘性能不佳时会导致性能较差,并发数受限。笔者通过在做基于海思3531编码器和解码器的过程当中(提供基于2路H264+1路AAC的TS流编码(输入为RTSP TS流)和RTSP流媒体解码播放),有以下2点收获,特分享给有需要的同仁。

优化1:同步读取数据源修改为异步读取数据源, FramedSource的子类的doGetNextFrame函数中不要阻塞等待数据源, 在无数据时可以重新增加一个定时器任务,延时再读取数据。在无数据时增加一个等待任务:

void MyFramedSource::doGetNextFrame()
{
    if(无数据可读){//延时3000微妙(3毫秒)再次读取数据
     envir().taskScheduler().scheduleDelayedTask(3000, (TaskFunc*)DelayReadFrame, this);
     return;
    }
    .....省略其他正常逻辑
}

static void MyFramedSource::DelayReadFrame(FramedSource *sourc)
{
     source->doGetNextFrame();
}

优化2:[......]

阅读全文

深刻理解Live555源码,掌握这把RTSP,RTP的瑞士军刀

我无意评价Live555的源码是否优雅易懂,但对于我这种C++设计模式应用不熟的IT老兵,还是很难直接通过阅读源码深刻清晰,一目了然的理解其中的调用逻辑。Live555中关于RTSP的Session,SubSession的概念,以及FramedSource和Sink的抽象都很不错的。但对于其任务单步调用机制,以及如何读取一帧数据及时发出一帧数据的全部逻辑, 真不容易得到清晰的处理逻辑。实践出真知,笔者本文就介绍一种通过运行时堆栈信息迅速理解关键代码和关键逻辑的方法。

先来观察本文尾部的GDB打印的堆栈信息,是笔者在实际开发中在Live555中扩展了mp4文件格式的支持,凡是ffmpeg_server目录下的的都[......]

阅读全文

Live555通过SDP文本信息实现对RTP的接收

笔者最近因为工做中需要用到此功能,特把实现方法分享给有兴趣的网友。
我的方法来自Live555官方论坛最权威的方案,如下:
[Live-devel] Once again, SDP support for Live555 & interaction with FFMpeg
1.First, create a “MediaSession” object, by calling
“MediaSession::createNew()”, with the SDP description (string) as
parameter.

2.Then, go through each of this obj[......]

阅读全文

Live555用做RTSPClient时,利用RTP时间戳进行音视频同步的解决方案(必须有RTCP支持才可行)

先看来自Live555官网的2个常见问题
问题1:Why do most RTP sessions use separate streams for audio and video? How can a receiving client synchronize these streams?
回答:Sending audio and video in separate RTP streams provides a great deal of flexibility. For example, this makes it possible for a player to receive only the audio[......]

阅读全文