在开源Android屏幕投屏代码scrcpy中,使用了MediaCodec去获取和display关联的surface的内容,再通过写fd的方式(socket等)传给PC端,
MediaCodec的处理看起来比较清楚,数据in和数据out

这里我们做另外一个尝试,读取手机中的mp4文件,显示到app的surface上,来学习MediaCodec的使用。
code
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
public class PlayActivity2 extends AppCompatActivity implements SurfaceHolder.Callback {
private static final int REQUEST_PERMISSION = 1;
private static final String SAMPLE_MP4_FILE = "/sdcard/Download/test.mp4";
private SurfaceView surfaceView;
private MediaExtractor mediaExtractor;
private MediaCodec mediaCodec;
private boolean isPlaying = false;
private String TAG = "testPlay";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
Log.i(TAG, "onCreate");
surfaceView = findViewById(R.id.surfaceView);
surfaceView.getHolder().addCallback(this);
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
if (!isPlaying) {
Log.i(TAG, "set isPlaying true");
isPlaying = true;
// playVideo();
}
}
@Override
protected void onPause() {
super.onPause();
if (isPlaying) {
Log.i(TAG, "onPause");
isPlaying = false;

本文详细描述了如何在Android应用中使用MediaCodec解码MP4文件,并将其内容显示到SurfaceView上,涉及Surface创建、MediaExtractor和MediaCodec的交互,以及视频帧的处理和渲染过程。
最低0.47元/天 解锁文章
5680

被折叠的 条评论
为什么被折叠?



