0

我想从MediaPlayer的视频textureview每100毫秒帧和位图的颜色配置的截图(位图)应ARGB_8888为什么MediaPlayer.seekTo()和onSurfaceTextureUpdated()在循环内不起作用?

我认为onSurfaceTextureUpdated叫,每次我打电话mediaplayer.seekTo(时间表),和我可以在那里获得位图。

因此,我创建的活动,其中textureview一个按钮,像这样的活动应用上点击方法:

public void onViewClicked() { 

    float begin = starttimeframe; // starting point of analysis in timeframe 
    float end = endtimeframe;  // ending point of analysis in timeframe 

    int f = round(begin); 
    status = 2; 
    while (f < round(end)) { 
     mediaplayer.seekTo(f); 
     currenttimeframe = f; 
     f += 100; // forward to next frame (100ms interval) 
    } 

    Toast.makeText(Extractor2Activity.this, "Done!", Toast.LENGTH_SHORT).show(); 
} 

并添加代码时,表面纹理更新,这样捕捉textureview:

public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      Bitmap bitmap = Bitmap.createBitmap(tvWidth, tvHeight, Bitmap.Config.ARGB_8888); 
      textureView.getBitmap(bitmap); 

      File file = new File(Environment.getExternalStorageDirectory().toString(), "capture" + current timeframe + ".jpg"); 

      OutputStream fout = null; 
      try { 
       fout = new FileOutputStream(file); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); 
       fout.flush(); 
       fout.close(); 
       MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 

问题是,textureview上的视频不会更改,onSurfaceTextureUpdated在迭代期间不会被调用。

onSurfaceTextureUpdated()仅在Toast消息显示后才被调用,只有一次。

我想必须有一个解决方案,但我不擅长android编程,不知道如何解决这个问题。

如何使seekTo和onSurfaceTextureUpdated在循环时正常工作?

我试过

使用MediaMetadataRetriever.getFrameAtTime,它可以捕捉到内循环所需的帧,但获得的位图的颜色配置是默认RGB565,不知道如何从获得ARGB_8888配置的图像getFrameAtTime。

+0

等待帧缓冲,然后在每次seekTo()调用后渲染。 – Abbas

+0

@Abbas,感谢您的快速评论!你能否向我提供一些示例代码如何做到这一点? –

回答

0

一个小的递归解决方案将在这种情况下得心应手。你可以打电话寻求等待回电得到你的位图,并进一步寻求。直到你到达流的尽头。

public void onViewClicked() { 

    viewClicked = true; 

    seekTo(round(starttimeframe)); 
} 

public void seekTo(int time) { 
    if (time < round(endtimeframe)) { 
     mediaplayer.seekTo(time); 
     currenttimeframe = time; 
    } 
    else { 
     viewClicked = false; 
    } 
} 

public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    if (viewClicked) { 
     Bitmap bitmap = Bitmap.createBitmap(tvWidth, tvHeight, Bitmap.Config.ARGB_8888); 
     textureView.getBitmap(bitmap); 

     File file = new File(Environment.getExternalStorageDirectory().toString(), "capture" + current timeframe + ".jpg"); 

     OutputStream fout = null; 
     try { 
      fout = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); 
      fout.flush(); 
      fout.close(); 
      MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     seekTo(mediaPlayer.getCurrentPosition() + 100); 
    } 
} 
+0

谢谢@Abbas!现在我得到如何解决这个问题! –

相关问题