하나의 쓰레드 안에서 비디오 데이터와 음성을 끌어와서 화면에 그리고 음성을 출력해 주고 있는데요.
음성 데이터가 클 경우는 다음 그림을 그리는데 갭이 생겨서 Asynctask로 음성부분을 백그라운드에서 출력해주게 하고 있습니다.
byte[] videoBuffer = new byte[MAX_VIDEO_SIZE];
Bitmap bmp = Bitmap.createBitmap(nWidth, nHeight, Bitmap.Config.RGB_565);
ByteBuffer buf = null;
Canvas canvas = null;
while(1)
{
nRet = xxxLib.GetVideoData(videoBuffer, nWidth, nHeight);
if ( nRet == 0 ) {
buf = ByteBuffer.wrap(videoBuffer);
bmp.copyPixelsFromBuffer(buf);
canvas.drawBitmap(bmp, null, m_dst, null);
playTask = new PlayAudio();
playTask.execute();
}
}
그냥 핵심만 추출한 코드구요.
AsyncTask를 상속한 PlayAudio 클래스는 다음과 같습니다.
private class PlayAudio extends AsyncTask<Void, Integer, Void> {
byte[] audioData = new byte[MAX_AUDIO_SIZE];
@Override
protected Void doInBackground(Void... arg0) {
int nRet = xxxLib.GetPCMData(audioData);
if ( nRet == 0 ) {
if ( bAudioStart == false ) {
nAudioDecodeSamplerate = xxxLib.getM_nGetSamplerate();
nAudioDecodeChannel = xxxLib.getM_nGetChannel();
nAudioDecodeSize = xxxLib.getM_nGetSize();
if ( nAudioDecodeSamplerate != 0 && nAudioDecodeChannel != 0 && nAudioDecodeSize != 0 )
{
Log.d(LibTag, "nAudioDecodeSamplerate: " + nAudioDecodeSamplerate + " nAudioDecodeChannel: " + nAudioDecodeChannel + " nAudioDecodeSize: " + nAudioDecodeSize);
AudioInit();
bAudioStart = true;
}
}
if ( nAudioDecodeSize > 0 )
audioTrack.write(audioData, 0, nAudioDecodeSize);
}
return null;
}
}
문제는 지금 while() 안에서 클래스를 계속 new 해서 생성하고 실행하는 것입니다.
계속 가비지 콜렉터가 호출되는 상황인데요.
while()위에서 new 하고 실행하면 음성이 안나옵니다.
doinbackground가 끝나고 뭔가 해제에 관한 코드가 돌던가..
new를 한번만 하던가 해야될거 같은데 어떤식으로 사용하는지 검색해봐도 잘 모르겠습니다.
도움 부탁드려요..감사합니다.