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

linux下用valgrind工具检查程序内存泄漏和程序性能优化

valgrind是linux下优秀的程序检查工具,优秀软件开发人员必备的瑞士军刀。其有很多工具包可以使用,具体可以参考官方文档和网络其他文章,本文仅限介绍用其进行内存泄漏、内存越界和程序性能优化。

linux centOS 6 下可以通过yum安装valgrind

yum install valgrind

1. 内存泄漏检查和内存越界检查,执行以下命令,其中test为需要检查的程序名

检查程序test需要以-g调试参数编译,才能报告内存问题的准确代码位置。

valgrind --tool=memcheck  --leak-check=full  --show-reachable=yes --vgdb=no  ./test

执行完后,会得到相信的统计结果,主要分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抓包文件中提取视频的方法,命令如下:

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
保存本地文件为./test1.mp4

通过gstreamer从rtp抓包pcap文件中提取H265的视频,保存为mp4文件:

gst-launch-1.0.exe filesrc location=H:\nvrScale.pcap ! pcapparse dst-port=58442 ! application/x-rtp,media=video,clock-rate=90000,payload=96,encoding-name=H265 ! rtph265depay ! h265parse ! mpegtsmux ! filesink location=./nvrH265.ts

通过gstreamer从rtp抓包pcap文件中提取AMR-WB的音频频,保存为原始的pcm文件, 如果执行命令报很多错误,请放弃用以下方法(是参数不匹配引起,gstreamer的arm插件兼容有bug):

::COD[......]

阅读全文

静态首页和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斤不反弹
亲自试用瘦身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函数中不要阻塞等待数据源, 在无数据时可以重新增加一个定时器任务,延时再读取数据。在无数据时增加一个等待任务:

void MyFramedSource::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一个定时器类的对象我附在下面代码中,可参考代码中的注释:

TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds,
                         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中,凡是分配定时器的地方,[......]

阅读全文