項目需求
按幀讀取視頻,修改幀,存儲視頻
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’
准備工作完成開始開發//初始化
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 BitmapAndroidFrameConverter bitmapConverter = new AndroidFrameConverter();
Bitmap bitmap = bitmapConverter.convert(frame);
Frame frame = bitmapConverter.convert(bitmap);
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);