android 将H264帧解码为字节数组

6vl6ewon  于 2023-11-15  发布在  Android
关注(0)|答案(3)|浏览(121)

我有一个H264视频流,我需要在我的Android应用程序中显示.如果我consigure MediaCodec与表面,然后视频被解码到我的应用程序没有问题,我可以看到它在这个表面.
但我也需要在某些时刻获得视频的位图(即在SD卡上存储某些帧)。是否可以配置MediaCodec库返回一个字节数组,而不是直接面向曲面工作?
另一个选择是直接从表面获取位图,但我在SDK上也找不到这个选项。

4bbkushb

4bbkushb1#

可以使用MediaMetadataRetriever

MediaMetadataRetriever mediaMetadataRetriever=new MediaMetadataRetriever(); //should be stored as an instance variable
mediaMetadataRetriever.setDataSource(mVideo.getVideoUrl(Video.SD));
int time = videoView.getCurrentPosition()* 1000; //micro-to-milliseconds
Bitmap bmFrame = mediaMetadataRetriever.getFrameAtTime(time);

字符串

编辑:

要检索原始字节数据而不涉及UI,您可以逐帧推进时间,获取Bitmap并将其转换为字节数组。
为了提高效率,考虑fork FFmpegMediaMetadataRetriever,它的FFmpegMediaMetadataRetriever.java有方法private native byte [] _getFrameAtTime(long timeUs, int option);,跳过整个Bitmap转换过程。

bnl4lu3b

bnl4lu3b2#

如果使用TextureView和SurfaceTexture包裹在Surface中,则可以执行此操作。
https://developer.android.com/reference/android/view/TextureView#getBitmap()
如果想以非视觉方式进行,您可以使用ImageReader的Surface和PixelCopy(Android N+)。
注意事项:

  • 这两种方法都不太可能用于加密视频
  • getBitmap()返回一个Bitmap,它的尺寸是TextureView的尺寸,而不是视频的尺寸。

这个项目展示了. https://github.com/dburckh/HeifViewer

beq87vna

beq87vna3#

试试这个:

public class GameView extends SurfaceView {
   private Bitmap bmp;
   private SurfaceHolder holder;

   public GameView(Context context) {
         super(context);
         holder = getHolder();
         holder.addCallback(new SurfaceHolder.Callback() {

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                }

                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                       Canvas c = holder.lockCanvas(null);
                       onDraw(c);
                       holder.unlockCanvasAndPost(c);
                }

                @Override
                public void surfaceChanged(SurfaceHolder holder, int format,
                              int width, int height) {
                }
         });
         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
   }

   @Override
   protected void onDraw(Canvas canvas) {
         canvas.drawColor(Color.BLACK);
         canvas.drawBitmap(bmp, 10, 10, null);
   }

字符串
}

相关问题