摘要:七 RTP打包与发送rtp传送开始于函数:MediaSink::startPlaying()。想想也有道理,应是sink跟source要数据,所以从sink上调用startplaying(嘿嘿,相当于directshow的拉模式)。看一下这个函数:Boolean MediaSink::startPlaying(MediaSource& source, afterPlayingFunc* afterFunc, void* afterClientData)
{ //参数afterFunc是在播放结束时才被调用。 // Make sure we're not already bein
阅读全文
摘要:接上篇,看看HelloWorld的启动过程。展开项目视图:展开/inc,/src目录,我们看到对应的.h,.cpp文件,还有个很特别的HelloWorldEntry.cpp,我们可以猜到这个就是HelloeWorld程序的入口了,进去瞧瞧:果然有个int OspMain(int argc, char *pArgv[])的方法,找到这句:r = Osp::App::Application::Execute(HelloWorld::CreateInstance, pArgs);Excute前一个参数传的是ApplicationInstanceFactory对象,由HelloWorld类产生。我们再
阅读全文
摘要:开发环境的搭建就不介绍了,目前bada只能在window下开发。打开IDE,选择新建一个bada C++ Application Project,写入项目名HelloWorld就建了第一个项目。项目结构图: 现在介绍一个各个文件夹:Includes是一个虚拟的文件夹,是bada运行的库。/inc,/src文件夹存放项目的C++源码 .h文件放在/inc文件夹,.cpp放在/src文件夹。/Home文件夹这个程序的文件系统(类似linux的home目录),比如文件的创建,读写等。/Icons文件夹存放项目使用到的图标,比如一些默认的程序启动图标,我们可以创建自己的图标去替换。/Res文件夹存放.
阅读全文
摘要:android手机中的震动由Vibrator实现。设置震动事件,需要知道其震动的时间长短、震动的周期等。在android中,震动的时间一毫秒计算(1/1000秒),所以如果设置的时间值太小,会感觉不出来。通过调用Vibrator的vibrate(long[] pattern, int repeat)方法实现。前一个参数为设置震动的效果的数组,第二个参数为 -1表示只震动一次,为0则震动会一直持续。一个demo:package com.shao.vibrator; import android.app.Activity;
import android.os.Bundle;
import and.
阅读全文
摘要:Mongodb操作里许多人喜欢采用PHP的循环操作,这种方式效率非常低下,可以优化。1、 查询: 有两种方式,在PHP里循环查询和使用$in的方式。做一个查询1000条数据的示例如下:// 循环查询
for($i = 0; $i < count($array); $i++) { $item = $collection -> findOne(array("_id" => new MongoId($array[$i]))); echo $item["profile"]["name"] . "<br /&g
阅读全文
摘要:书中的一些关键思想:1、构建资产1) 不需到场就可以正常运作的业务2) 股票3) 债券4) 基金5) 能产生收入的房产2、先构筑资产项,才用资产所产生的收入购买奢侈品3、会计、法律和商业知识非常重要4、通过公司的方式1)合理避税(买车、餐饮费)2)财产保护:用公司和信托来隐藏财富5、喜欢变化而不是害怕变化、喜欢挣百万美元而不是担心升职6、学习如何投资很重要7、坚持自己而不是随大众 现在许多人只是按部就班,上完学之后打一份工,度过10年、20年的时光,但是年薪20万、30万就能改变一生平平淡淡、成为房奴、车奴的境况,就能过上财务自由、舒适安全的生活吗?其实《富爸爸穷爸爸》是一个改变理财思路...
阅读全文
摘要:java访问C/C++有6步1.写java文件2.编译java生成class3.生成C/C++头文件。4.写C/C++文件5.编译生成dll(Window下)或so文件6.运行java程序下面介绍ubutun下一个JNI例子1.编写Sample1.java文件: public class Sample1 { public native int intMethod(int n); public native boolean booleanMethod(boolean bool); public native String stringMethod(String text); publ...
阅读全文
摘要:六 建立RTP会话首先更正一个概念:ServerMediaSession原先说代表一个流,其实是不准确的。它代表的是server端的一个媒体的名字,而说ServerMediaSubsession代表一个Track是准确的。以后流指的是那些有数据流动的组合。RTP的建立:RTP的建立过程无非是这样:client告诉server自己的rtp/rtcp端口号,server建立自己的rtp/rtcp socket,然后在收到PLAY请求时向客户端发数据。看起来非常简单。在收到SETUP请求时才建立连接,让我们看一下处理这个命令的函数:void RTSPServer::RTSPClientSession
阅读全文
摘要:五 RTSP服务运作基础基本搞明白了,那么RTSP,RTP等这些协议又是如何利用这些基础机制运作的呢?首先来看RTSP.RTSP首先需建立TCP侦听socket。可见于此函数:DynamicRTSPServer* DynamicRTSPServer::createNew(UsageEnvironment& env, Port ourPort,
UserAuthenticationDatabase* authDatabase,
unsigned reclamationTestSeconds) {
int ourSocket = setUpOurSocket(env, ourPort);
阅读全文
摘要:四 计划任务(TaskScheduler)深入探讨我们且把三种任务命名为:socket handler,event handler,delay task。这三种任务的特点是,前两个加入执行队列后会一直存在,而delay task在执行完一次后会立即弃掉。socket handler保存在队列BasicTaskScheduler0::HandlerSet* fHandlers中;event handler保存在数组BasicTaskScheduler0::TaskFunc * fTriggeredEventHandlers[MAX_NUM_EVENT_TRIGGERS]中;delay task保
阅读全文
摘要:三 消息循环看服端的主体:live555MediaServer.cpp中的main()函数,可见其创建一个RTSPServer类实例后,即进入一个函数env->taskScheduler().doEventLoop()中,看名字很明显是一个消息循坏,执行到里面后不停地转圈,生名不息,转圈不止。那么在这个人生的圈圈中如何实现RTSP服务和RTP传输呢?别想那么远了,还是先看这个圈圈中实现了什么功能吧。void BasicTaskScheduler0::doEventLoop(char* watchVariable) { // Repeatedly loop, handling readbl
阅读全文
摘要:二 基础类讲几个重要的基础类:BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类.比如UsageEnvironment代表了整个系统运行的环境,它提供了错误记录和错误报告的功能,无论哪一个类要输出错误,就需要保存UsageEnvironment的指针.而TaskScheduler则提供了任务调度功能.整个程序的运行发动机就是它,它调度任务,执行任务(任务就是一个函数).TaskScheduler由于在全局中只有一个,所以保存在了UsageEnvironment中.而所有的类又都保存了UsageEnvironment的指针,所以谁想把自
阅读全文
摘要:一直想研究live555,没有时间,终于因为项目的原因可以深入无间地研究一下了.所以在此著文以记之.一 如何编译live555利用mingw环境很容易:在live555文件夹下,genMakefiles mingwmake即可.可以用genWindowsMakefiles.cmd生成VC可用的makefile,但是对比较新的vc版本支持不好,需要自己改很多东西.用VC编译有一种更好的办法:手动为每个库都生成一个lib项目,为mediaServer生成exe项目,设置好各库之间的依赖关系,就可以用VC编译了.由于live555代码中没有单独支持gcc的东西,所以编译是相当的容易.这样就可以用VC
阅读全文
摘要:一般在其他类中是不能这个得到类中private属性和访问private方法的,但天无绝人之路,java强大的反射机制可以完成这个任务。建一个测试类A:package com.shao.test; public class A { private String testStr="just for test"; private void get(int index,String value){ System.out.println(index+":"+value+" and testStr:"+testStr); }
}
现在我们来访问A
阅读全文
摘要:我在面试测试工程师时,经常问到的一个问题是“给出Word另存为这个功能的测试用例”。除开基本的测试用例外,考虑到各种异常情况,例如内存已满、硬盘空间不足是非常重要的。但是针对移动互联网App来说,情况还要复杂的多。 一个重要原则是:测试你最终要发布给用户的App版本。 可能每日构建、每日测试的理念已经深入人心,我们很多时候测试的只是App的开发和Debug版本,而不是最终的Release版本。在打包最终的Release版本时,我们一般还要加上数字签名,或者再加上代码混淆。那么最终的发布版本和Debug版本肯定有不一致的地方。我们iPhone的App曾经使用过一个第三方开源库,在Debug...
阅读全文
摘要:经过几天的笔试,面试,终于拿到了东软的offer,虽然我认为自己的能力可以找到一份更好的工作,可毕竟自己又不是211院校的,看到其他同学忙着到处投简历的无奈,自己已经不能坚持自己之前的原则了,只希望自己毕业后能够有好的发展。大四剩下的日子,就没有什么压力了,编程,学自己以前想学还没来得及学的技术,哈哈
阅读全文
摘要:一般android应用程序安装完成后是不会自动创建快捷方式的,所以可以自己在程序启动时实现。需要权限 <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>和要点击快捷方式对应的那个activity的属性。 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="an
阅读全文
摘要:android软件的信息存储在PackageInfo中,ApplicationInfo主要包括名字、Package标签、版本信息和图标信息,如图:源码: import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content..
阅读全文