三棵杏IPC录播服务器产品信息
linux下用valgrind工具检查程序内存泄漏和程序性能优化
valgrind是linux下优秀的程序检查工具,优秀软件开发人员必备的瑞士军刀。其有很多工具包可以使用,具体可以参考官方文档和网络其他文章,本文仅限介绍用其进行内存泄漏、内存越界和程序性能优化。
linux centOS 6 下可以通过yum安装valgrind
yum install valgrind
1. 内存泄漏检查和内存越界检查,执行以下命令,其中test为需要检查的程序名
检查程序test需要以-g调试参数编译,才能报告内存问题的准确代码位置。
执行完后,会得到相信的统计结果,主要分4大类:
1. 肯定丢失的内存块统计 【definitely】类
2. 不直接丢失的内存块 【indirectly】类
3. 可能丢失的内存块统计 [possibly]类
4. 怀疑丢失的内存块统计 [suppressed]类
5. 内存Error,也即内存越界或野指针访问行为 [12 errors from 12 contexts], 尤其要注意:invalid write问题,回导致程序运行[......]
gstreamer从包含RTP的pcap文件提取视频保存mp4文件(文件由wireshark抓取)
好不容易从stackoverflow网站找到通过gstreamer从rtp抓包文件中提取视频的方法,命令如下:
参数说明:
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
保存本地文件为./test1.mp4
通过gstreamer从rtp抓包pcap文件中提取H265的视频,保存为mp4文件:
通过gstreamer从rtp抓包pcap文件中提取AMR-WB的音频频,保存为原始的pcm文件, 如果执行命令报很多错误,请放弃用以下方法(是参数不匹配引起,gstreamer的arm插件兼容有bug):
静态首页和WordPress组合做企业网站
受朋友所托,帮朋友新开的公司做了个网站,感觉很nice,网站为 湖南诺继生物技术有限公司, 网站内容挂载的是WordPress。
技术很简单,首页是挂上菜单和图片动态展示栏,菜单项挂到WordPresss子目录下,这样可以利用WordPress强大的后台内容发布管理能力。
WordPress的主题采用的是Prower, 我看中其风格简约,菜单大气,但其不支持二级菜单,我修改了这个theme,为其增加二级菜单点击显示功能。有需要的网友可以联系我。
本软件工作室承接Android下的音视频流媒体APP快速开发
提供基于Android下的音视频相关的播放,采集,流媒体,RTP相关APP开发。基于MediaCodec H264硬编硬解,AAC,G711,G726等音频编解码等,性能绝佳,延时小于0.5秒,辅以jni调用ffmpeg转码及live555提供流媒体推送或拉取,确保项目开发周期短。
项目金额15000 RMB起。具体金额具体商谈,联系方式请点链接
1. libRtspClient Demo下载测试:
RTSP/RTMP流媒体播放库,可支持边录制,边播放。采用多线程支持多任务拉流。底层采用live555和ffmepg最新版本,可轻易支持android等平台。
RTSP支持onvif的用户密码认证。
编解码目前支持:视频支持H264,H265, 音频支持aac。
Windows下demo程序下载
2. Android下demon已可下载测试, 目前仅支持arm硬件架构,android API版本为4.2以上:
支持H264 + aac解码,MediaCodec硬解码
Android下demo程序下载
支持三棵杏站长夫人的微商事业(维密瘦不入口瘦身产品 & Gracing文胸)
产品1:强烈推荐维密瘦不入口瘦身产品,湖南省中医药研究院出品,亲自试用瘦身15斤不反弹
产品2:众所周知,乳腺癌是女性健康的杀手之一,而普通的文胸是带有钢圈和用不透气的海绵制成的,钢圈无形中给女性乳房带来伤害。同时不透气的海绵导致乳房长期处于亚健康状态。歌瑞森是无钢圈文胸的领导者,采用透气的直立棉(非海绵)和零甲醛零污染舒适环保材料制成,时尚而舒适,是各位女性朋友的最佳选择,也是男性朋友送给恋人妻子的最好礼物!欢迎大家扫描微信,加本站长夫人,小博的微信,了解了解,谢谢大家!
歌瑞森官网
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
实现函数:
* Add ADTS header at the beginning of each and every AAC packet.
* This is needed as MediaCodec encoder generates a packet of raw
* AAC data.
*
* Note the packetLen must count in the ADTS header itself !!! .
*注意,这里的packetLen参数为raw aac Packet Len + 7; 7 bytes adts header
**/
private void addADTStoPacket(byte[] packet, int packetLen) {
int profile = 2; //AAC LC,MediaCodecInfo.CodecProfileLevel.AACObjectLC;
int freqIdx = 5; //32K, 见后面注释avpriv_mpeg4audio_sample_rates中32000对应的数组下标,来自ffmpeg源码
int chanCfg = 2; //见后面注释channel_configuration,Stero双声道立体声
/*int avpriv_mpeg4audio_sample_rates[] = {
96000, 88200, 64000, 48000, 44100, 32000,
24000, 22050, 16000, 12000, 11025, 8000, 7350
};
channel_configuration: 表示声道数chanCfg
0: Defined in AOT Specifc Config
1: 1 channel: front-center
2: 2 channels: front-left, front-right
3: 3 channels: front-center, front-left, front-right
4: 4 channels: front-center, front-left, front-right, back-center
5: 5 channels: front-center, front-left, front-right, back-left, back-right
6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
8-15: Reserved
*/
// fill in ADTS data
packet[0] = (byte)0xFF;
packet[1] = (byte)0xF9;
packet[2] = (byte)(((profile-1)<<6) + (freqIdx<<2) +(chanCfg>>2));
packet[3] = (byte)(((chanCfg&3)<<6) + (packetLen>>11));
packet[4] = (byte)((packetLen&0x7FF) >> 3);
packet[5] = (byte)(((packetLen&7)<<5) + 0x1F);
packet[6] = (byte)0xFC;
}
以下理论转载自博客:http://wiki.multimedia.cx/index.php?title=ADTS
Audio Data Transport Stream (ADTS) is a format, used by MPEG TS or Shoutcast to stream audio, usually AAC.
Structure[......]
本软件工作室承接基于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 API版本为4.2以上:
支持H264 + aac解码,MediaCodec硬解码
Android下demo程序下载
本软件工作室承接基于Live555的二次开发软件项目
RTSP服务端:可提供TS流直播,点播, mp4格式扩展的直播和点播, 各种定制的音频和视频流组合流的流媒体服务。
RTSP客户端项目包括:录制RTSP流媒体,存储文件(格式为mp4或者ts).
不管服务端还是客户端,可提供双视频流或多视频流以及多音频流的流媒体扩展。
包括但不限于:H264 + h264 + aac 3个以上track的RTSP流, 或 H264 + mjepg + aac 等3个以上track的RTSP流, 或者H264 + h263 + aac包括3个以上track的RTSP流。
可灵活定制推送多track,多种编码格式混合的流, 以及录制多种编码格式混合的mp4或者ts格式文件。能确保各个track中的音视频播放同步。
值得一提的是H264 + mjpeg + aac 这种3个track的混合流模式,广泛应用于远程教育、培训和视频会议等领域。
项目金额12000 RMB起。具体金额具体商谈,联系方式请点链接
1. libRtspClient Demo下载测试:
RTSP/RTMP流媒体播放库,可支持边录制,边播放。采用多线程支持多任务拉流。底层采[......]
Live555性能优化实践
网上很多文章提到了Live555的单线程任务调度模式,在用作RTSP服务时,导致了在并发量较多或者磁盘性能不佳时会导致性能较差,并发数受限。笔者通过在做基于海思3531编码器和解码器的过程当中(提供基于2路H264+1路AAC的TS流编码(输入为RTSP TS流)和RTSP流媒体解码播放),有以下2点收获,特分享给有需要的同仁。
优化1:同步读取数据源修改为异步读取数据源, FramedSource的子类的doGetNextFrame函数中不要阻塞等待数据源, 在无数据时可以重新增加一个定时器任务,延时再读取数据。在无数据时增加一个等待任务:
{
if(无数据可读){//延时3000微妙(3毫秒)再次读取数据
envir().taskScheduler().scheduleDelayedTask(3000, (TaskFunc*)DelayReadFrame, this);
return;
}
.....省略其他正常逻辑
}
static void MyFramedSource::DelayReadFrame(FramedSource *sourc)
{
source->doGetNextFrame();
}
优化2: 定时器的内存分配管理可以通过内存池来管理,重复利用。而不需要重复分配和释放。可以想象一下,一个30帧每秒的H264视频+40多帧每秒的AAC音频,定时器的内存分配和释放的次数是70次每秒。完整代码我就不贴了,摘录一段关键代码,从已分配内存上new一个定时器类的对象我附在下面代码中,可参考代码中的注释:
TaskFunc* proc,
void* clientData) {
if (microseconds < 0) microseconds = 0;
DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000));
//从内存池fPool中分配一块内存
void *alarmMemory = fPool.malloc(sizeof(AlarmHandler));
//从已分配内存上,构造一个AlarmHandler定时器处理对象
AlarmHandler* alarmHandler = new(alarmMemory) AlarmHandler(proc, clientData, timeToDelay);
fDelayQueue->addEntry(alarmHandler);
return (void*)(alarmHandler->token());
}
在Live555中,凡是分配定时器的地方,[......]