【原创】Android无线视频监控小车--后篇

本文是Android无线视频监控小车的后篇,主要实现了语音对讲功能。作者分享了软件界面、设计要点和部分Java代码,包括图像采集、TCP数据发送、心跳包设计以及音频处理。在嵌入式部分,通过2个线程实现了收发功能。

           之前这个小车已经做出了一个框架,之后趁手头工作少点的时候,加紧做了下语音,目前基本已经实现我需要的功能了。

           软件界面还是一种测试的界面,能用就行,美化软件我向来都不怎么样,一直搞单片机的,弄弄vs eclipse的不是很习惯。

 

           前篇请参考地址:

          http://blog.csdn.net/lynnlase/article/details/17246877

 

          几个设计要点:

          1.图像采用mjpg采集的图片,速度上我觉得的是够的。

          2.tcp发送数据时注意采用byte[]数组,不要转成char[]型。

          3.心跳包我是自己设计的10s一次。单独一个线程。

          4.其他没有什么了,贴下部分java代码。

 

@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);

		setContentView(R.layout.main);
		InitView();
				m_in_buf_size = android.media.AudioRecord.getMinBufferSize(8000,
				AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

		m_in_rec = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,
				AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
				m_in_buf_size);

		m_out_buf_size = android.media.AudioTrack.getMinBufferSize(8000,
				AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

		m_out_trk = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
				AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
				m_out_buf_size, AudioTrack.MODE_STREAM);
		

		m_in_bytes = new byte[m_in_buf_size];
		m_keep_running = runflag = listenflag = false;
		heartcount = 0;
		btnBack.setEnabled(false);
		btnCall.setEnabled(false);
		btnGo.setEnabled(false);
		btnLeft.setEnabled(false);
		btnRight.setEnabled(false);
		btnStop.setEnabled(false);
		btnListen.setEnabled(false);

		heartThread = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				// runflag = true;
				while (true) {
					try {
						Thread.sleep(1000);

					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					heartcount++;
					if (heartcount == 10) {

						// msg = "lynnupup";
						if (runflag) {
							mPrintWriter.write("lynnlase");
							mPrintWriter.flush();
						}
						heartcount = 0;
					}
				}
			}
		});
		heartThread.start();

		// myImageView.setImageResource(R.drawable.);

		// Uri uri = Uri.parse("http://192.168.2.70:8080/?action=stream");
		// video.setMediaController(new MediaController(this));
		// video.setVideoURI(uri);
		// videoView.start();
		// video.requestFocus();
	}
public void onClick(View bt) {
		heartcount = 0;
		String msg;
		switch (bt.getId()) {
		case R.id.btncall:
			btnCall.setText("关闭声音");
			if (!m_keep_running) {
				newThread = new Thread(new Runnable() {
					@Override
					public void run() {
						int bytes_read;
						byte[] bytes_pkg;
						int readsize = 0;
						m_keep_running = true;
						m_in_rec.startRecording();
						while (m_keep_running) {
							bytes_read = m_in_rec.read(m_in_bytes, 0,
									m_in_buf_size);
							if (AudioRecord.ERROR_INVALID_OPERATION != bytes_read) {

								try {
																						         // Log.v("lynn", str);
									dos.write(m_in_bytes, 0, bytes_read);
									dos.flush();
									heartcount = 0;

								} catch (IOException e) {

									e.printStackTrace();

								}

							}
						}

						m_in_rec.stop();

					}
				});
				newThread.start(); // 启动线程
			} else {
				m_keep_running = false;
				btnCall.setText("开启声音");
				// m_in_rec.stop();
				// newThread.stop();
			}

			break;
		case R.id.btnlisten:
			if (!listenflag) {
				listenflag = true;
				btnListen.setText("关监听");
				playThread = new Thread(new Runnable() {
					@Override
					public void run() {
						int bytes_read = 0;
						byte[] bytes_pkg = new byte[8192];
						
                    
						m_out_trk.play();
						while (listenflag) {
							try {
								bytes_read=ios.read(bytes_pkg);
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							if (bytes_read > 0) {
								m_out_trk.write(bytes_pkg, 0, bytes_read);
								Log.v("lynn", String.valueOf(bytes_read));
							}

						}

						m_out_trk.stop();
					}
				});
				playThread.start(); // 启动线程
				msg = "lynnlynn";
				mPrintWriter.write(msg);
				mPrintWriter.flush();

			} else {
				listenflag = false;
				btnListen.setText("开监听");
				msg = "lynnover";
				mPrintWriter.write(msg);
				mPrintWriter.flush();

			}

			break;
		default:
			break;
		}

	}

                以上是oncreat處理以及onclick事件代碼,主要是音频部分。因为采集的都是pcm流,也可以实时录制成wav文件。

                嵌入式部分简单了,2个线程实现收发功能就好。

 

                 效果如下:

   
               
              

                基本告一段落了,其实家庭安防方面实现对讲,视频通话真的挺实用的,可以考虑做一套成熟的方案推广,虽然现在市场上其实也蛮多的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值