0

クラスJavaCameraViewを使用してビデオストリームを開き、そこからフレームをキャプチャするAndroidアプリケーションを開発しています。次に、これらのフレームをバッファに保存するワーカー スレッドと、バッファからすべてのフレームを取得して画像処理技術で処理する別のスレッドを実現することを目標としています。したがって、バッファーはこれら 2 つのワーカー スレッド間で共有されるリソースであり、同時に実行する必要があるため、バッファーを同時に満たして空にする必要があります。バッファを ConcurrentLinkedQueue として実現しようと考えたところ、Runnable インターフェースを実装することで 2 つのスレッドが実現されました。次に、メイン アクティビティで、それらを宣言し、インスタンス化してから開始しますが、最初のアクティビティのみが実行され、2 番目のアクティビティは開始されないようです。ここに私のコードを投稿します:

1)Buffer.java

public class Buffer {
private ConcurrentLinkedQueue<Mat> MyBuffer = new ConcurrentLinkedQueue<Mat>();
private static final String TAG = "MyBufferClass :: ";
private int index = 1;

public Buffer(){
    Log.d(TAG,"Buffer Created");
}

public void insertElementInTail(Mat element){
    MyBuffer.offer(element);
}

public Mat retrieveElementInHead(){
    synchronized (MyBuffer){
        if(!MyBuffer.isEmpty()){
            return MyBuffer.peek();
        }else{
            return null;
        }
    }
}

public Mat removeElementInHead(){
    synchronized (MyBuffer){
        if(!MyBuffer.isEmpty()){
            return MyBuffer.poll();
        }else{
            return null;
        }
    }
}

public int getSize(){
    return MyBuffer.size();
}
}

2)SaveInBuffer.java

public class SaveInBuffer implements Runnable {

private Handler myHandler;
private Buffer myBuffer;

public Handler myThreadHandler;
MainActivity mainActivity;
Handler mainHandler;
int what = -1;


public SaveInBuffer(Buffer myBuf, MainActivity mainActivity){
    //super("SaveInBuffer");
    this.myBuffer = myBuf;
    this.mainActivity = mainActivity;
    this.mainHandler = mainActivity.mainHandler;
}

@Override
public void run(){
    Looper.prepare();
    myThreadHandler = new Handler(){
        public void handleMessage( Message msg ){
             if(msg.what==4){
                 Mat returnedFrame = (Mat)msg.obj;
                 myBuffer.insertElementInTail(returnedFrame);
             }
        }
    };
    Looper.loop();
}

}

3)TakeFromBuffer.java

public class TakeFromBuffer implements Runnable{

public Handler consumerHandler;
private Buffer myBuffer;

public TakeFromBuffer(Buffer myBuffer){
    this.myBuffer = myBuffer;
}

@Override
public void run(){
    Looper.prepare();
    Mat consumedFrame = myBuffer.removeElementInHead();
    Looper.loop();
}
}

バッファーは MainActivity 内で作成され、パラメーターとしてスレッドに渡されます。問題は、バッファを共有リソースとしてどのように管理するか、つまり同期技術を実装するか、そして 2 つのスレッドを同時に実行することが非常に重要であるため、2 つのスレッドを同時に開始する方法です。

どうすればいいですか?どんな助けでも大歓迎です。

4

0 に答える 0