当前位置:  编程技术>移动开发
本页文章导读:
    ▪擒获电脑的声音放到手机播放        捕获电脑的声音放到手机播放最近笔记本的音响坏了,郁闷啊、纠结中,有一个想法:捕获电脑的声音,这个声音可以是movie的声音、music的声音、或者系统的声音,只要是经过声卡播放的声.........
    ▪ 怎么成为一名软件工程师:小弟我的道路        如何成为一名程序员:我的道路 下面要说的是我在成为一名程序员的道路上做的几件事情。写在这里除了要让自己铭记在心外,我还希望它能对别人有些用处。 1. 建立一个博客 这是我后.........
    ▪ 网秦用户量逢质疑       网秦用户量遭质疑 北京时间12月11日凌晨消息,美国市场研究公司FJE Research周一发布研究报告,对网秦(NYSE:NQ)的中国国内用户量提出质疑。该公司认为,网秦的实际用户量可能仅为900万,远远.........

[1]擒获电脑的声音放到手机播放
    来源: 互联网  发布时间: 2014-02-18
捕获电脑的声音放到手机播放

最近笔记本的音响坏了,郁闷啊、纠结中,有一个想法:捕获电脑的声音,这个声音可以是movie的声音、music的声音、或者系统的声音,只要是经过声卡播放的声音,都可以捕获。然后通过usb发送到手机上播放,也可以通过wifi发送到手机播放。

看看怎么做,可以使用微软发布的DirectX SDK,我使用的是DirectX 10 SDK,很多地方可以下载到这个sdk, 大小500M左右。在sdk的目录DirectX 10 SDK\Samples\C++\DirectSound下,有一个例子CaptureSound,CaptureSound是用来捕获声音的,它一面捕获声音,一面写进一个wav的文件里。修改这个例子,把捕获的声音立即发送给手机,可以通过usb发送、或者wifi。

首先设置pc的录音通道,在电脑的托盘上,双击小喇叭,菜单“选项”->“属性”,选择“录音”,只勾选“立体声混音”。看一下效果:

 

转载,请写明出处:http://blog.csdn.net/menghnhhuan/article/details/8281747

usb通信时这样的:

在pc上使用adb命令:adb forward tcp:4626 tcp:4883,在PC上建立4626端口通信数据将被重定向到手机端server的4883端口;然后初始化socket,连接到手机4626端口,进行socket通信。PC端代码如下:

 

DWORD WINAPI usbThreadFunc(LPVOID threadNum)
{
	int length;	
	CString temp;
	if(!initAdb())//adb init
	{
		MessageBox(0, L"初始化手机出错!", L"提示", MB_OK);
		return 0;
	}
	if(!InItClientSock())//socket init
	{
		MessageBox(0, L"初始化IP地址出错!", L"提示", MB_OK);
		return 0;
	}
	if(!USBConnectSock((HWND)threadNum))//connect socket
	{
		MessageBox(0, L"连接IP地址出错!", L"提示", MB_OK);
		return 0;
	}
	//等待连接的时候,连接可能被取消。
	if(clientThreadRun)
	{
	}
	else
	{
		MessageBox(0, L"用户取消!", L"提示", MB_OK);
		return 0;
	}
	SetDlgItemText( (HWND)threadNum, IDC_SOUNDFILE, TEXT("&USB Disconnect") );
	EnableWindow( GetDlgItem( (HWND)threadNum, IDC_RECORD ), TRUE );
	EnableWindow( GetDlgItem( (HWND)threadNum, IDC_BUTTON_WIFI ), FALSE );	
	while(clientThreadRun)
	{
		if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
		{
			memset(recv_message_client, 0, sizeof(recv_message_client));
			LogPrintf(recv_message_client);
		}		
	}
	return 0;
}

 

这里说道最重要的是捕获声音,下面的代码启动了一个线程来处理捕获到的声音:

DWORD WINAPI captureThreadFunc(LPVOID hDlg)
{
	DWORD dwResult;
	while(g_bRecording) 
	{ 
		dwResult = MsgWaitForMultipleObjects( 1, &g_hNotificationEvent, FALSE, INFINITE, QS_ALLEVENTS );
		switch( dwResult )
		{
		case STATUS_WAIT_0://case WAIT_OBJECT_0 + 0:

			RecordCapturedData();
			break;
		}
	}
	return 0;
}

 

在创建捕获声音的设备的时候,会创建一个事件,这个事件就是捕获到一定长度的声音之后(比如2K大小的声音),会发出一个通知,告诉你去处理。上面的线程,就是一直待等待这个事件,然后再去处理捕获到的声音,把声音发送给socket,交给手机处理,代码:

HRESULT RecordCapturedData() 
{
    HRESULT hr;
    VOID*   pbCaptureData    = NULL;
    DWORD   dwCaptureLength;
    VOID*   pbCaptureData2   = NULL;
    DWORD   dwCaptureLength2;
    DWORD   dwReadPos;
    DWORD   dwCapturePos;
    LONG lLockSize;

    if( NULL == g_pDSBCapture )
        return S_FALSE;

    if( FAILED( hr = g_pDSBCapture->GetCurrentPosition( &dwCapturePos, &dwReadPos ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("GetCurrentPosition"), hr );

    lLockSize = dwReadPos - g_dwNextCaptureOffset;
    if( lLockSize < 0 )
        lLockSize += g_dwCaptureBufferSize;

    // Block align lock size so that we are always write on a boundary
    lLockSize -= (lLockSize % g_dwNotifySize);

    if( lLockSize == 0 )
        return S_FALSE;

    // Lock the capture buffer down
    if( FAILED( hr = g_pDSBCapture->Lock( g_dwNextCaptureOffset, lLockSize, 
                                          &pbCaptureData, &dwCaptureLength, 
                                          &pbCaptureData2, &dwCaptureLength2, 0L ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("Lock"), hr );

	
    // Write the data to socket发送给手机
	socketSend(pbCaptureData,dwCaptureLength);
    // Move the capture offset along
    g_dwNextCaptureOffset += dwCaptureLength; 
    g_dwNextCaptureOffset %= g_dwCaptureBufferSize; // Circular buffer

    if( pbCaptureData2 != NULL )
    {
        // Write the data to socket发送给手机
 		socketSend(pbCaptureData2,dwCaptureLength2);

        // Move the capture offset along
        g_dwNextCaptureOffset += dwCaptureLength2; 
        g_dwNextCaptureOffset %= g_dwCaptureBufferSize; // Circular buffer
    }

    // Unlock the capture buffer
    g_pDSBCapture->Unlock( pbCaptureData,  dwCaptureLength, 
                           pbCaptureData2, dwCaptureLength2 );
    return S_OK;
}

 

通过socket发送数据的代码很简单,没有任何处理捕获到的声音数据,就发送给手机了

VOID socketSend(VOID* send_message, int length)
{
	if(clientSockConnect==0)
	{		
		int send_len = length;
		char * buf = (char*)send_message;

		while(send_len>0)
		{		
			int rc = send(clientSock,buf,send_len, 0);//MSG_OOB
			if (rc < 1)//if (rc == SOCKET_ERROR || rc == 0)
			{
				break;
			}	
			send_len -= rc;
			buf += rc;
		}
		buf = NULL;
	}
}


手机端的代码如下,注意手机上audioTrack的设置:44100,AudioFormat.CHANNEL_CONFIGURATION_STEREO,AudioFormat.ENCODING_PCM_16BIT。在启动电脑捕获声音的时候也要同样的设置,否则播放的声音是杂音:

public class TcpConnect extends Thread {
	private ServerSocket mServerSocket;
	private Socket mClient;
	private Handler mHandler;
	private boolean running = false;
	private boolean palying = false;

	private int audioPlayBufSize;
	private AudioTrack audioTrack;
	private static final int frequency = 44100;
	private static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
	private static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

	private ArrayList<byte[]> inBuf = new ArrayList<byte[]>();

	public TcpConnect(Handler handler) {
		mHandler = handler;

		audioPlayBufSize = AudioTrack.getMinBufferSize(frequency,
				channelConfiguration, audioEncoding);
		audioTrack = new AudioTrack(
				AudioManager.STREAM_MUSIC,// .STREAM_RING,//.STREAM_MUSIC,
				frequency, channelConfiguration, audioEncoding,
				audioPlayBufSize, AudioTrack.MODE_STREAM);
		audioTrack.setStereoVolume(1.0f, 1.0f);
		Log.d("playPCAudio", "audioPlayBufSize: " + audioPlayBufSize);

		palying = false;
		inBuf.clear();
	}

	public void run() {
		try {
			mServerSocket = new ServerSocket(4883);

			System.out.println("TcpConnect" + "开始监听");
			mClient = mServerSocket.accept();
			System.out.println("TcpConnect" + "检测到有连接");
			InputStream is = mClient.getInputStream();

			running = true;
			int readLen = 0;
			byte[] readBuf = new byte[audioPlayBufSize];

			System.out.println("TcpConnect" + "接收");
			playThread palyt = new playThread();
			palyt.setPriority(Thread.MAX_PRIORITY);
			palyt.start();

			while (running) {
				if ((readLen = is.read(readBuf, 0, audioPlayBufSize)) > 0) {
					byte[] tmpBuf = new byte[readLen];
					System.arraycopy(readBuf, 0, tmpBuf, 0, readLen);
					synchronized (inBuf) {
						inBuf.add(tmpBuf);
					}
				}
			}
		} catch (Exception e) {
			System.out.println("TcpConnect TCP error:" + e.getMessage());
		}
		System.out.println("TcpConnect over");
	}

	class playThread extends Thread {

		public playThread() {
		}
		public void run() {
			audioTrack.play();
			palying = true;

			while (running) {
				ArrayList<byte[]> buf = new ArrayList<byte[]>();
				buf.clear();
				synchronized (inBuf) {
					if (inBuf.size() == 0)
						continue;
					buf = (ArrayList<byte[]>) inBuf.clone();
					inBuf.clear();
				}
				for (int i = 0; i < buf.size(); i++) {
					byte[] tmpBuf = buf.get(i);
					audioTrack.write(tmpBuf, 0, tmpBuf.length);
				}
			}
			if (palying) {
				audioTrack.stop();
				audioTrack.release();
				palying = false;
			}
		}
	}
}

我的博客:http://blog.csdn.net/menghnhhuan

PC和手机的代码下载地址:

http://download.csdn.net/detail/menghnhhuan/4873008

大家在捕获声音的时候,可能会出现杂音,需要调试,请留言。
 


    
[2] 怎么成为一名软件工程师:小弟我的道路
    来源: 互联网  发布时间: 2014-02-18
如何成为一名程序员:我的道路

下面要说的是我在成为一名程序员的道路上做的几件事情。写在这里除了要让自己铭记在心外,我还希望它能对别人有些用处。

1. 建立一个博客

这是我后来才认识到的事,其实应该很早就去做。如果你是跟我类似的情况,你应该尽早开通一个博客——尽管还不知道该写什么。注册一个域名,买一个空 间。你会惊奇的发现有很多可写的东西。你可以记录下你成为一名程序员的过程,或写一下你感兴趣的技术方面的东西。我一直以为没什么好写的,可当真正思考这 些问题时,却发现有很多值得写的。最重要的事情是开始去做。

2. 开发一些东西

开发什么并不重要。选一种编程语言,任何一种都行,开始干。你不必去花大量的时间来决定应该使用什么语言。直接开始学一种语言,事实上最重要的是学 习编程语言的基础知识,而不是劳神费力的去选择一种“最好的编程语言”。我选择的是PHP。因为它是一种被广泛使用的语言,在网上有大量的学习范例,我已 经通过搭建一个WordPress网站而熟练的掌握了它。没有丝毫的遗憾。它使我学到了很多基础知识。我还学习了其它语言吗?当然,我后来涉猎了很多脚本 语言,我要在下一个项目上试试Ruby。编程语言不断的在变化,不要只盯着一个不放。

3. 注册你的GitHub帐户

我已经在Bitbucket上有了一个代码库。我最初选择注册Bitbucket是因为它能提供5个免费的私有库。后来我决定在GitHub上注册。事实上,我丝毫没有拖延,看看我的成果吧。

4. 向开源项目捐赠代码

我早该如此做了。我起初低估了做这种事情的重要性,说老实话,我现在仍需要进一步重视。向开源项目捐赠代码,这是一种很好的学习别人如何编程的方法,并且能把自己的代码公开。我今晚的就要去列一个准备去参与的开源项目的清单。

5. 热心参与

这也是我需要改进的方面。我应该到stackoverflow网站上去回答更多的问题,在一些博客,科技网站上分享自己的东西。去那些网站,让大家看到你。不在网上露面,就相当于待在屋里不出门却想找一份做巴黎导游的工作。

重复做第2,4和5点 其它一些事情

很明显,每一个有志向的程序员都应该每天阅读Hacker News和其它开发/科技/编程类的博客文章。

我打听到了不少的技术讨论会。这周末我准备去参加一个。我会把那里的情况写出来。

我在这里并没有提读书。我喜欢阅读,但我们没有买任何的关于web开发的书籍。这是我个人的做法。我相信很多人都会建议首先买一本书看看。

找一些能和你讨论你的web开发/技术/编程想法的人和群体。如果我做了更多的第5项,我可能找到了更多的这样的人。

好了,这就是我要说的。这些就是在过去的一年里我成为一个程序员的成长之路上做到事情。如果有人觉得在这个清单里我还应该加入什么,请给我留言。我永远都希望听到新的观点。


    
[3] 网秦用户量逢质疑
    来源: 互联网  发布时间: 2014-02-18
网秦用户量遭质疑

北京时间12月11日凌晨消息,美国市场研究公司FJE Research周一发布研究报告,对网秦(NYSE:NQ)的中国国内用户量提出质疑。该公司认为,网秦的实际用户量可能仅为900万,远远低于该公司宣称的1.42亿。

  这份研究报告主要依据iiMedia Research中国移动安全市场份额报告、国内几大主要Android应用平台下载数据、百度及新浪微博搜索指数,质疑网秦的真实用户数量与官方公布数字不符。

  网秦创立于2005年,是一家移动互联网安全服务提供商,也是中国第一家成功登陆美国纽交所的移动互联网企业。

  受此负面消息影响,网秦股价周一暴跌11%,报于5.46美元。

  以下是报告全文:

  网秦自称中国市场上占据主导地位的移动安全服务提供商,截至9月30日,其累积注册用户和月均活跃用户量分别为1.419亿和4970万,但这些数字过高,让人无法相信。

  网秦中国市场份额的秘密

  网秦在6月的投资者会议上称,截至今年3月,它在中国市场上所占份额为63%。但令人尴尬的是,在最近一次的投资者会议上,网秦并未披露和更新市场份额,原因何在?很明显,这是该公司正试图隐瞒的东西。

  事实是残酷的。网秦的业内地位被极度夸大了,用户基数被夸大了十倍以上,而且最近几个月以来,这种情况不断恶化。详情如下:

  市场研究公司iiMedia Research发布的2012年第二季度中国移动安全市场报告显示,奇虎360(NYSE:QIHU)移动安全软件在中国市场上占据着主导地位,份额为63%。网秦移动安全软件排名在腾讯的QQ手机软件管理之下,份额为5.4%,低于第一季度的11.4%。

  根据iiMedia Research的估测,第二季度中国移动安全软件的用户总数已达1.62亿人,环比增长27%。同期网秦的用户基数缩水了40%,从1500万人减少至900万人,这一数字甚至比网秦宣传的新增用户人数(1700万人)还要低。

  艾瑞咨询移动安全报告也显示出类似情况:奇虎360占有62.4%的中国市场份额,而网秦仅为2.5%左右。奇虎360在第三季度财报中披露,360手机安全卫士的用户人数已经达到1.49亿人,这意味着网秦的用户仅为600万,远低于该公司所宣称的1.5亿。

  赛迪顾问的最新报告也显示,奇虎360在中国移动安全市场上占据主导地位,份额超过70%。这份报告甚至没有提到网秦。

  韩国未来资产(Mirae Asset)的移动互联网使用模式报告显示,如果网秦的月活跃用户是真实的,那么它的移动安全软件在中国应用市场中的排名应该是第五位,仅略低于腾讯微信。这就意味着,网秦移动安全软件的排名甚至高于许多中国互联网巨头,例如阿里巴巴集团旗下的淘宝网、优酷土豆(NYSE:YOKU)和百度(Nasdaq:BIDU)地图,这未免也太荒唐了。

  网秦的中国用户获取渠道糟糕

  网秦在2011年报中称,该公司有很大一部分用户来自于其PC端和移动网站。网秦官方网站并未公布其产品下载数据,但它利用新浪(Nasdaq:SINA)作为另一种下载渠道,因此我们能对真实的数字进行评估。新浪的数据显示,本月Android版网秦移动安全软件的下载量仅为8次,累计总量仅为1055次;而Symbian版网秦移动安全软件的总下载量也没有超过4400次。

  网秦可能会说,该公司在Google Play应用商店中的销售数字表现良好。但不幸的是,由于谷歌的服务在中国内地经常中断,因此大多数Android智能手机用户都是从其他地方获取应用的,Google Play在中国Android应用市场上只是一个很小的销售渠道。

  网秦还可能辩称,它在第三方应用商店中拥有庞大的下载量。但是,来自这些渠道的数据看起来同样糟糕;与其竞争对手相比,网秦移动安全软件在中国最流行的应用商店中几乎默默无闻。平均而言,网秦移动安全软件在这些应用商店中的下载量仅相当于360手机安全卫士的4.7%,腾讯QQ手机软件管理的5.3%。基于这些数据,网秦市场份额可能为3%,符合iResearch和iiMedia Research预测区间(2.5%到5.4%),远低于该公司宣称的63%。

  用户在哪里?

  网秦提供的数据中,最模糊的部分是预装量。网秦宣称,该公司与手机厂商签有广泛的合作协议,而预先安装到手机中是一种重要的用户获取渠道。但是,预装量不能自然而然地转换为活跃用户量。如果网秦认为其活跃用户量是正确的,也就是第三季度5000万个,每天增加10万个,那么与其他中国互联网公司相比,网秦必须拥有“无与伦比”的用户基数。

  百度是中国占据主导地位的搜索引擎,而百度指数能够反映关键词在过去30天内的网络曝光率及用户关注度。从百度指数来看,网秦所宣称的用户增长速度不可靠。事实上,最近几个月,网秦的百度搜索量一直在下降,与市场领导者的差距正在扩大。我们使用“网秦”品牌名进行搜索,原因是在使用“网秦手机安全”进行搜索时,得到的结果并不能反映实际情况。

  在网秦的官方论坛上,注册用户仅为8741人;与此相比,网秦宣称到2012年9月为止,其用户总数为1.42亿人。自2012年10月30日以来,网秦官方论坛上没有任何新帖子或回帖,网秦移动安全子论坛则自2012年9月18日以来就一直都处于“死亡”状态,没有新帖,没有新评论,也没有新的互动。对于一家号称拥有5000万活跃用户的互联网公司来说,很难想象其论坛在近3个月里没有任何用户活动。

  在评估网秦在中国互联网用户中的人气时,新浪微博搜索非常有用,人们喜欢在这项拥有约4亿用户的服务上评论和共享某种产品的用户体验。如果网秦确实在移动安全市场上占据着主导地位,那么这家公司本应在微博上拥有超出其竞争对手的用户参与度;但从我们所看到的情况来说,网秦没能证明自己,原因是与网秦移动安全相关的微博消息数量仅相当于360手机安全卫士的约2.6%,以及QQ手机软件管理的31.5%,这意味着其行业地位远不及网秦所宣称的水平。

  研究网秦的大多数分析师关心这家公司的财务状况,如增长率和利润率等,但他们只听取了网秦管理层的说法,对中国互联网行业却没有基本理解。

  在中国,最近几年移动安全市场的竞争状况日趋激烈,原因是各大互联网巨头都将重点更多地放在移动用户身上。中国智能手机用户已经拥有了足够多的免费选择,而且仍旧没有习惯为互联网服务付费。网秦的“免费增值”业务模式并不新鲜,而且已被证明在这个市场上遭遇了失败,原因是大多数竞争对手都免费提供相同服务。2008年,奇虎360开始提供免费的杀毒产品,而瑞星、金山软件和卡巴斯基等主要竞争对手迅速消亡。

  更糟糕的是,用户对网秦产品的评论很差,“网秦”在中国互联网已经是一个声名狼藉的名字。在2011年的“3.15”消费者权益日,CCTV揭露了一项丑闻,内容是网秦及其子公司飞流九天曾有意欺骗消费者,以寻求获得非法利益。

  投资者应避开网秦

  不受欢迎的商业模式、低于平均值的用户评分再加上糟糕的品牌名,毫无疑问,网秦用户已经逃离,其市场份额从2012年第一季度到第二季度大幅缩水一半以上。

  当我们讨论网秦的商业模式时,并非只涉及用户量欺诈的问题,其来自于中国的营收也显示出危险信号。如果网秦真实的中国用户基数仅为900万人,而并非公司所宣称的1.42亿人,那么我们就需要把网秦第三季度2580万美元的营收砍去44%。

  此外,不诚实的管理层是无法令人信任的,因此网秦来自国际市场的营收的可靠性也应被质疑。

  目前市场一致预期,网秦2013年的每股收益可达0.95美元;在进行上述研究以后,我们对此持有异议。我们将网秦的目标价定为3美元,这一目标价是基于我们对网秦2013年每股收益为0.5美元和6倍的收益率而得出的,意味着网秦股价将从当前水平下跌50%以上。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android录音应用实例教程 iis7站长之家
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3