android studio 用 Javacv 读取视频流

来源:互联网 发布:阿里云ip地址 编辑:程序博客网 时间:2024/04/29 12:15

项目需求

按帧读取视频,修改帧,存储视频

javacv项目地址

bytedeco-javacv

android studio + javacv环境搭建


packagingOptions{
exclude ‘META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties’
exclude ‘META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties’
exclude ‘META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml’
exclude ‘META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml’
}


compile ‘org.bytedeco:javacv:1.1’
compile ‘org.bytedeco.javacpp-presets:opencv:3.0.0-1.1:android-arm’
compile ‘org.bytedeco.javacpp-presets:ffmpeg:2.8.1-1.1:android-arm’


build.gradle

准备工作完成开始开发

//初始化FrameGrabber videoGrabber = new FFmpegFrameGrabber(path);videoGrabber.start();//获取视频源的参数double frameRate = videoGrabber.getFrameRate();int sampleRate = videoGrabber.getSampleRate();Frame frame;int count = 0;String ffmpeg_link = Environment.getExternalStorageDirectory()        .getAbsolutePath() + "/" + "obama.avi";File result = new File(ffmpeg_link);if (result.exists()) result.delete();if (recorder == null) {    //初始化recorder    recorder = new FFmpegFrameRecorder(result,            videoGrabber.getImageWidth(), videoGrabber.getImageHeight(), videoGrabber.getAudioChannels());    recorder.setFormat("avi");    recorder.setSampleRate(sampleRate);    // Set in the surface changed method    recorder.setFrameRate(frameRate);    recorder.start();}while (true) {    //获取下一帧数据    frame = videoGrabber.grabFrame();    if (frame == null) break;    if (frame.image == null) continue;    //转码  Frame ->Bitmap  操作Bitmap完成后Bitmap->Frame    AndroidFrameConverter bitmapConverter = new AndroidFrameConverter();    Bitmap currentImage = bitmapConverter.convert(frame);    currentImage = initScence(currentImage);//操作Bitmap,    Frame frame1 = bitmapConverter.convert();    //写入recorder    recorder.record(frame1);}

遇到的错误解决

  • 错误列表

    • java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil:指定arm平台的opencv和ffmpeg的库文件
    • java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avcodec:不能使用android sdk23的api,我改了targetSdkVersion: 22
    • Error:A problem occurred configuring project ‘:testjavacv’.

    Could not find javacpp-presets-Mac OS X-x86_64.jar (org.bytedeco:javacpp-presets:1.2).
    Searched in the following locations:
    https://jcenter.bintray.com/org/bytedeco/javacpp-presets/1.2/javacpp-presets-1.2-Mac OS X-x86_64.jar
    解决:
    configurations {
    all*.exclude group: ‘org.bytedeco’, module: ‘javacpp-presets’
    }

标注

  • javacv Frame转换成android Bitmap
AndroidFrameConverter bitmapConverter = new  AndroidFrameConverter();Bitmap bitmap = bitmapConverter.convert(frame);Frame frame = bitmapConverter.convert(bitmap);
  • javacv Frame、Mat和ToIplImage相互转换
 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video.mp4");   AndroidFrameConverter converterToBitmap = new AndroidFrameConverter();   OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat();//.ToIplImage   // Grab an image Frame from the video file   Frame frame = grabber.grab();   // Perform a shallow copy to represent frame as a Mat   Mat mat = converterToMat.convert(frame);   // Do some processing on mat with OpenCV   Mat processedMat = ...   // Convert processedMat back to a Frame   frame = converterToMat.convert(processedMat);   // Copy the data to a Bitmap for display or something   Bitmap bitmap = converterToBitmap.convert(frame);
0 0