旧安卓改监控摄像头,把摄像手机作为服务器,客户端接入即可查看摄像数据,优化Camera摄像头数据转码效率不高

本文探讨了如何优化旧安卓设备作为监控摄像头的数据处理,通过将捕获的帧转换为YuvImage对象并在多个线程中进行处理,提高帧率,从而改善监控效果。尽管仍存在掉帧问题,但实验证明这种策略有所改进。同时,介绍了MainActivity类的修改,包括自动获取服务器IP地址,以及客户端的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最麻烦的是如何高效处理捕捉到的每帧数据,这也导致做出来的效果不好,5–6帧每秒,像在看ppt,所以这次把捕捉到的数据先转换为YuvImage对象,之后开启新线程执行YuvImage转jpg的方法得到jpg得字节数据后启动新线程去执行发送数据到客户端的工作,放开Yuvimage解码jpg的线程,可以不用等发送完成,在发送数据的同时继续解码。虽然还是会掉帧,但实践证明这样操作效果还是比较好的。或许是摄像头捕捉的帧率本来就不高(猜的)。

在这里插入图片描述掉线时交替闪烁,收发数据时,闪烁越快,帧率越高,类似电脑后面网口上那颗小黄灯,一闪一闪的,晚上在村里放,你就是那个村里最靓的仔(坏笑)

在这里插入图片描述

MainActivity类做了写更改,比如自动获取机器的IP地址,用这个IP地址作为服务器,客户端接入就可以直接通信收发图像数据。增加了k1用来转码jpg,开新线程发送图像数据

 Camera camera;
    SurfaceView surfaceView;//预览
    SurfaceHolder surfaceHolder;
public static boolean boo1;//是否可以发送数据
boolean boo3;//连接中
    Socket soc;
    InputStream input;
    OutputStream out;
    TextView textView;//显示配置端口信息
int port = 8081;
    ServerSocket ser;//服务器
boolean is_ser_link_ser;//记录网路是否正常
    String ip = "";
public Thread gh1;
boolean led_flash;//未连接闪关灯交替闪烁

protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sett1();//启动相机
        textView = findViewById(R.id.textView);
        ip = getIpAddress(MainActivity.this);
if(ip != "" && !ip.equals("0.0.0.0")){
   
            textView.setText(ip+":"+port);
}else{
   
            textView.setText("没有wifi网络,请打开wifi重启");
}
        gh1 = new Thread(new Runnable() {
   
public void run() {
   

}
});
        gh1.start();
}

//打开相机
public void sett1(){
   
        camera = camera.open(0);
        camera.setDisplayOrientation(90);
        surfaceView = findViewById(R.id.surfaceView1);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
   
public void surfaceCreated(SurfaceHolder holder) {
   
try {
   
                    camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
   
                    e.printStackTrace();
}
                camera.startPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
   

}
public void surfaceDestroyed(SurfaceHolder holder) {
   

}
});
//获取摄像实时数据
        camera.setPreviewCallback(new Camera.PreviewCallback() {
   
public void onPreviewFrame(byte[] data, Camera camera) {
   
//判断服务器是否打开
if(is_ser_link_ser ){
   //判断服务器是否正常打开,否则开启新线程去打开服务器
                    Camera.Size size = camera.getParameters().getPreviewSize();
                    YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
if(image != null ){
   //&& new Date().getTime()-tim>30
yuvtojpeg(size, image);
}
}else {
   
if(!boo3){
   
                        ip = getIpAddress(MainActivity.this);
if(ip != "" && !ip.equals("0.0.0.0")){
   
                            textView.setText(ip+":"+port);
new Thread(new Runnable() {
   
public void run() {
   
                                    boo3 = true;
                                    is_ser_link_ser = soc_link_ser();
                                    boo3 = false;
}
}).start();
}else{
   
                            textView.setText("没有wifi网络,请打开wifi重启");
}
}else{
   
//断线时,未连接时,闪关灯交替闪烁
if(led_flash){
   
                            led_flash = !led_flash;
                            Camera.Parameters parameters = camera.getParameters();
                            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烂废物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值