要实现一个可以播放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中添加必要的权限。