将H264帧解码为字节数组

时间:2016-05-30 10:23:56

标签: android bitmap

我需要在我的Android应用中显示一段H264视频。如果我用表面来构造MediaCodec,那么视频会被解码到我的应用程序没问题,我可以在这个表面看到它。

但我还需要在某些时刻获得视频的位图(即在SD卡上存储某些帧)。是否可以将MediaCodec库配置为返回字节数组而不是直接处理表面?

另一种选择是直接从表面获取位图,但我也无法在SDK上找到此选项。

2 个答案:

答案 0 :(得分:1)

您可以使用MediaMetadataRetriever

FFmpegMediaMetadataRetriever.java

修改

要在不涉及UI的情况下检索原始字节数据,您可以逐帧推进,获取位图并将其转换为字节数组。

为了提高效率,请考虑分叉FFmpegMediaMetadataRetrieverprivate native byte [] _getFrameAtTime(long timeUs, int option);方法{{1}}跳过整个位图转换过程。

答案 1 :(得分:-3)

试试这个:

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);
   }

}