如何实现一个万能播放器

235 阅读1分钟

要实现一个可以播放MP3,MP4,SVGA和Alpha视频的万能播放器,并使用来自Flutter端的外部纹理进行渲染,需要在Android端使用SurfaceTexture类。

以下是示例代码:

public class VideoPlayerActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
    private static final String TAG = "VideoPlayerActivity";

    private MediaPlayer mediaPlayer;
    private TextureView textureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_player);

        textureView = findViewById(R.id.texture_view);
        textureView.setSurfaceTextureListener(this);

        // 接收来自Flutter端的视频路径参数
        String videoPath = getIntent().getStringExtra("video_path");

        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(videoPath);
            mediaPlayer.prepareAsync();

            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    // 播放视频
                    mediaPlayer.start();
                }
            });

        } catch (IOException e) {
            Log.e(TAG, "Error: " + e.getMessage());
        }
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
        Surface surface = new Surface(surfaceTexture);

        if (mediaPlayer != null) {
            mediaPlayer.setSurface(surface);
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

    }
}

在Flutter端,可以使用flutter_vlc_player插件来将外部纹理传递给Android端。

以下是一个简单的Flutter代码示例:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_vlc_player/flutter_vlc_player.dart';

class VideoPlayer extends StatelessWidget {
  final String videoPath;

  const VideoPlayer({Key key, this.videoPath}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return AndroidView(
      viewType: 'video_player_view',
      creationParamsCodec: StandardMessageCodec(),
      creationParams: {'videoPath': videoPath},
    );
  }
}

要让这段代码工作,还需要在Android端注册Flutter平台视图并在Manifest中添加必要的权限。