1:建立android項目我這裡使用的語音是java
2:在項目gradle上導入包:
(1)implementation group: 'org.bytedeco', name: 'javacv', version: '1.4.1'
(2)implementation group: 'org.bytedeco', name: 'javacpp', version: '1.4.1'
(3)implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.4.1-1.4.1', classifier:'android-arm'
(4)implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '3.4.2-1.4.1', classifier: 'android-arm'
*注意*剛開始在實作這個功能的時候也參考了很多大佬的CSDN部落格,大多是導入後面三個包,但是一直在報Could not initialize class org.bytedeco.javacpp.avutil 這個錯誤,後面導入了第一個包後這個錯誤才沒有發生。
3:流截圖代碼實作:
public void getFrame(String url) {
new Thread(() -> {
AndroidFrameConverter bitmapConverter = new AndroidFrameConverter();
FrameGrabber grabber = new FFmpegFrameGrabber(url);
if (start(grabber)) {
try {
Frame img = grabber.grabFrame()
Bitmap bitmap= bitmapConverter.convert(img);
} catch (Exception e) {
e.printStackTrace();
//System.err.println("丢幀");
}
} else {
Log.e("有結果:", "失敗");
}
stop(grabber);
}).start();
}
public static boolean start(FrameGrabber grabber) {
try {
grabber.start();
return true;
} catch (org.bytedeco.javacv.FrameGrabber.Exception e2) {
System.err.println("第一次打開失敗,重新開始");
try {
grabber.restart();
return true;
} catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
try {
System.err.println("重新開機抓取器失敗,正在關閉抓取器...");
grabber.stop();
} catch (org.bytedeco.javacv.FrameGrabber.Exception e1) {
System.err.println("停止抓取器失敗!");
}
}
}
return false;
}
public static boolean stop(FrameGrabber grabber) {
try {
grabber.flush();
grabber.stop();
return true;
} catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
return false;
} finally {
try {
grabber.stop();
} catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
System.err.println("關閉抓取器失敗");
}
}
}