我需要在我的Android应用中显示一段H264视频。如果我用表面来构造MediaCodec,那么视频会被解码到我的应用程序没问题,我可以在这个表面看到它。
但我还需要在某些时刻获得视频的位图(即在SD卡上存储某些帧)。是否可以将MediaCodec库配置为返回字节数组而不是直接处理表面?
另一种选择是直接从表面获取位图,但我也无法在SDK上找到此选项。
答案 0 :(得分:1)
您可以使用MediaMetadataRetriever:
FFmpegMediaMetadataRetriever.java
修改强>
要在不涉及UI的情况下检索原始字节数据,您可以逐帧推进,获取位图并将其转换为字节数组。
为了提高效率,请考虑分叉FFmpegMediaMetadataRetriever,private 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);
}
}