andriod通过wifi获得网络摄像头视频流数据并保手机中

如题,正在做一个关于智能拍照小车的毕业设计,目前卡在把摄像头数据保存成视频存入手机这一步,我在网上查询看到的基本都是调用手机本身的摄像头而没有处理网络摄像头的方法。有没有直接处理网络视频流保存视频的方法,还是说要先保存一帧帧的图片然后再转化成视频。由于小弟是电子信息工程的对这方面知之甚少,如果问的问题太低级请各位大佬多多担待。可以的话能否告知一个可行的思路,感激不尽!

您好,这里给出您三个解决方法,因摄像头设备不同,无法给出代码,
第一种您可以参考这个:https://blog.csdn.net/OnafioO/article/details/52022965
第二种:https://bbs.csdn.net/topics/392075638
第三种:这是个思路,以上还不能解决的话,您可以参考这个,先找到摄像头访问接口,具体可以连接厂家,获取到摄像机的资源之后,想动态的保存到手机的话,可以参考m3u4模式,这种模式是可以直接在后面追加的,所以可以动态保存。

如果解决了您的问题,请点击采纳,如果并没有,请在下方回复,我会继续帮您解答。

您好,两种解决思路:
1. 如果该网络摄像头支持 ONVIF 协议的话,可以使用 ONVIF 协议 获取视频流。具体使用 可参考官网文档
2. 如果该网络摄像头,支持 rtsp 协议,可以使用 rtsp 获取视频流。您可以参考 这个 https://blog.csdn.net/zong596568821xp/article/details/80306987

package zfp.config;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Bitmap.CompressFormat;
import android.os.Environment;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

@SuppressLint("NewApi")
public class PaintVedio extends SurfaceView implements Callback, Runnable {
//屏幕大小变量
private static int screenWidth;//获得屏幕尺寸保存在这里
private static int screenHeight;
//连接与线程变量
private boolean runFlag = false;//可以作为连接条件.暂时没有对此变量起实际作用
private static SurfaceHolder holder;//赋值实际的surfaceView holder地址.只是便于调用
private HttpURLConnection conn;//URL HTTP地址连接类,只能作为类变量.便于销毁view时关闭
private Thread thread;//访问资源并绘图的线程变量,在surfaceView状态改变时 启用或关闭连接
public Bitmap bmp=null;

public PaintVedio(Context context, AttributeSet attrs) {
    super(context, attrs);//例行公务,别管他
    screenValue();//屏幕尺寸赋值
    holder = this.getHolder();
    holder.addCallback(this);//启用自带的回调函数
}

// ========================================
/**
 * 获得屏幕像素值
 */
private void screenValue() {
    DisplayMetrics dm = new DisplayMetrics();
    dm = getResources().getDisplayMetrics();
    screenWidth = dm.widthPixels;
    screenHeight = dm.heightPixels;
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    runFlag = true;
    thread = new Thread(this);
    thread.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {

// change事件会在切换横竖屏时出现.还有初始化出现一次
runFlag = true;
thread = new Thread(this);
thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    runFlag = false;
    conn.disconnect();
}
public void savepicture() throws FileNotFoundException{

    saveBitmap(bmp);

    }


public void saveBitmap(Bitmap bitmap) throws FileNotFoundException
{
    Date dt=new Date();
    if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED)) {
        String sdcard = Environment.getExternalStorageDirectory().getPath()
                .toString()+"/camera";
        FileOutputStream fos = new FileOutputStream(sdcard+dt.toLocaleString()+".jpeg");
        bitmap.compress(CompressFormat.JPEG, 100, fos);

    }
}

@Override
public void run() {
    Canvas c;
    InputStream is;
    URL videoURL = null;

// Paint p = new Paint(); // 创建画笔,流图像可以不需要
String imageURL = "http://192.168.8.1:8083/?action=snapshot";//视频地址,注意访问流媒体的action.
try {
videoURL = new URL(imageURL);;

} catch (Exception e) {
}
//绘图质量配置
BitmapFactory.Options o = new BitmapFactory.Options();// 配置原图缩放值
o.inPreferredConfig = Bitmap.Config.ARGB_8888;// 高质量
while (runFlag) {
c = null;
try {
synchronized (holder) {
c = holder.lockCanvas();// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
// ===========================================================
// 连接后的请求,与流都只能用一次,需要重新连接并获得流
conn = (HttpURLConnection)videoURL.openConnection();//此方法会new HttpURLConnection并调用connect()
// conn.connect();//getInputStream会自动调用此方法.此方法一般用在new HttpURLConnection之后.(new的时候没有发送连接请求)
is = conn.getInputStream(); //获取流
bmp = BitmapFactory.decodeStream(is, null, o);
bmp = Bitmap.createScaledBitmap(bmp, screenWidth,
screenHeight, true);// 把图片根据屏幕尺寸进行缩放

                c.drawBitmap(bmp, 0, 0, null);
                Thread.sleep(30);// 间隔时间,建议把这个参数放进配置里.肉眼约能分别42毫秒间隔的图像.                    
            }
        } catch (Exception e) {

// System.out.println(e.getMessage());
}finally{
holder.unlockCanvasAndPost(c);// 解锁画图并提交
conn.disconnect();
}
}

}

}

你百度"android mjpeg"应该可以找到你想要的那部分内容