Używam OpenCV, aby spróbować trochę przetwarzać wideo na żywo. Ponieważ przetwarzanie jest dość ciężkie, znacznie opóźnia ramki wyjściowe, przez co strumień na żywo wygląda na wzburzony.Android Asynctask do przetwarzania klatek wideo na żywo
Chciałbym odciążyć niektóre przetwarzanie w AsyncTask. Wypróbowałem to i to sprawia, że wideo jest znacznie płynniejsze. Jednak kończy się uruchamianie dużej ilości zadań na raz, a następnie powoli zaczną powracać z niektórymi wynikami.
Czy istnieje sposób na spowolnienie tego procesu i oczekiwanie na wynik za pomocą instrukcji Synchronizuj lub innej metody?
Na każdej ramie aparatu uruchamiam jedno z tych zadań. DoImgProcessing wykonuje długie przetwarzanie i zwraca wynik ciągu.
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;
}
Używałbym pojedynczego wątku z blokującą sekwencją do wstawiania ramek. – njzk2
Nigdy nie napisałem jednej z nich. Byłbym szczęśliwy, gdyby mogłem zaakceptować twoją odpowiedź, gdybyś mógł podać trochę przykładowego kodu. – Jameo