Ich verwende OpenCV, um einige Live-Video-Verarbeitung zu versuchen. Da die Verarbeitung ziemlich umfangreich ist, werden die Ausgangsframes erheblich verzögert, wodurch der Live-Stream unruhig wirkt.Android Asynctask, um Live-Video-Frames zu verarbeiten
Ich möchte einige der Verarbeitung in eine AsyncTask entladen. Ich habe es ausprobiert und es macht das Video tatsächlich viel glatter. Es beginnt jedoch eine große Menge von Aufgaben auf einmal, und dann werden sie langsam mit einigen Ergebnissen zurückkehren.
Gibt es eine Möglichkeit, dies zu verlangsamen, und warten auf ein Ergebnis, entweder mithilfe von Synchronize-Anweisungen oder eine andere Methode?
Auf jedem Kamerarahmen starte ich eine dieser Aufgaben. DoImgProcessing führt die lange Verarbeitung durch und gibt ein Zeichenfolgenresultat zurück.
private class LongOperation extends AsyncTask<Mat, Void, String> {
@Override
protected String doInBackground(Mat... params) {
Mat inputFrame = params[0];
cropToCenter(inputFrame);
return doImgProcessing(inputFrame);
}
@Override
protected void onPostExecute(String result) {
Log.d(TAG, "on post execute: "+result);
}
@Override
protected void onPreExecute() {
Log.d(TAG, "on pre execute");
}
}
public Mat onCameraFrame(Mat inputFrame) {
inputFrame.copyTo(mRgba);//this will be used for the live stream
LongOperation op = new LongOperation();
op.execute(inputFrame);
return mRgba;
}
Ich würde einen einzelnen Thread mit einem Blockingqueue verwenden, um Frames einzufügen. – njzk2
Ich habe nie eine von diesen geschrieben, ich bin glücklich, Ihre Antwort zu akzeptieren, wenn Sie ein wenig Beispielcode geben könnten – Jameo