Android实现视频播放的几种实现方式(附带源码)
1. 项目背景详细介绍
视频播放是 Android 应用中非常常见的功能场景,例如短视频应用、在线视频教育、播放器 App、广告投放、直播回放等。
Android 官方提供了多种实现视频播放的方式,每种方式各有优缺点,适用于不同业务场景。
2. 项目需求详细介绍
能播放本地视频与网络视频;
能自定义 UI 控制播放(如播放、暂停、进度条);
支持全屏/小窗播放;
性能稳定,兼容性好;
易于扩展,满足复杂需求。
3. 相关技术详细介绍
VideoView:Android 自带控件,最简单的视频播放方式。
MediaPlayer:底层播放引擎,支持更多自定义控制。
SurfaceView / TextureView:提供绘制视频画面区域。
ExoPlayer:Google 官方推荐的强大播放器框架,适合复杂场景。
WebView:简单嵌入网页视频播放(如 YouTube、Bilibili)。
4. 实现思路详细介绍
方式实现难度可定制性适用场景VideoView简单低快速播放本地或网络视频MediaPlayer + SurfaceView中高自定义 UI,高性能TextureView + MediaPlayer中高支持变换、缩放、旋转ExoPlayer高很高短视频/在线视频/直播WebView简单低播放网页视频,如 YouTube
5. 几种视频播放方式完整实现代码
5.1 使用 VideoView 播放视频
// ================== MainActivity.java ==================
package com.example.videodemo;
import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
public class MainActivity extends AppCompatActivity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.video_view);
// 设置控制栏
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
// 播放网络视频
Uri uri = Uri.parse("https://www.example.com/video.mp4");
videoView.setVideoURI(uri);
videoView.start();
}
}
// ================== activity_main.xml ==================
android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
5.2 使用 MediaPlayer + SurfaceView
// ================== MediaPlayerActivity.java ==================
package com.example.videodemo;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class MediaPlayerActivity extends AppCompatActivity {
private SurfaceView surfaceView;
private MediaPlayer mediaPlayer;
private String videoUrl = "https://www.example.com/video.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_surface);
surfaceView = findViewById(R.id.surface_view);
SurfaceHolder holder = surfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
playVideo(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
});
}
private void playVideo(SurfaceHolder holder) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.setDisplay(holder);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> mp.start());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
}
}
}
// ================== activity_surface.xml ==================
android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
✅ 优点:更灵活,性能好,适合大多数播放场景。
⚠️ 缺点:代码较多,需要自己写控制 UI。
5.3 使用 TextureView + MediaPlayer
// ================== TextureActivity.java ==================
package com.example.videodemo;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Surface;
import android.view.TextureView;
public class TextureActivity extends AppCompatActivity {
private TextureView textureView;
private MediaPlayer mediaPlayer;
private String videoUrl = "https://www.example.com/video.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_texture);
textureView = findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(android.graphics.SurfaceTexture surface, int width, int height) {
playVideo(new Surface(surface));
}
@Override
public void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture surface, int width, int height) {}
@Override
public boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(android.graphics.SurfaceTexture surface) {}
});
}
private void playVideo(Surface surface) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(videoUrl);
mediaPlayer.setSurface(surface);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> mp.start());
} catch (Exception e) {
e.printStackTrace();
}
}
}
// ================== activity_texture.xml ==================
android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/texture_view" android:layout_width="match_parent" android:layout_height="match_parent" />
✅ 优点:支持平移、缩放、旋转特效,适合短视频类应用。
⚠️ 缺点:实现复杂度较高。
5.4 使用 ExoPlayer(推荐)
// ================== ExoPlayerActivity.java ==================
package com.example.videodemo;
import androidx.appcompat.app.AppCompatActivity;
import android.net.Uri;
import android.os.Bundle;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.ui.PlayerView;
public class ExoPlayerActivity extends AppCompatActivity {
private PlayerView playerView;
private ExoPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exo);
playerView = findViewById(R.id.player_view);
player = new ExoPlayer.Builder(this).build();
playerView.setPlayer(player);
MediaItem mediaItem = MediaItem.fromUri(Uri.parse("https://www.example.com/video.mp4"));
player.setMediaItem(mediaItem);
player.prepare();
player.play();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (player != null) {
player.release();
}
}
}
// ================== activity_exo.xml ==================
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="match_parent" app:show_buffering="when_playing" app:use_controller="true"/>
✅ 优点:
Google 官方推荐
功能丰富(快进、倍速、缓存、加密)
性能好、兼容性强
⚠️ 缺点:需要引入依赖
6. 代码详细解读
VideoView:最简单快速,适合临时性播放。
MediaPlayer + SurfaceView/TextureView:更灵活,适合有自定义 UI 的播放器场景。
ExoPlayer:官方推荐方案,适用于大多数商业级播放器。
WebView:无需处理视频资源,只适合嵌入网页。
7. 项目详细总结
方式难度可定制性性能推荐场景VideoView⭐❌⭐⭐简单视频播放MediaPlayer + Surface⭐⭐✅⭐⭐⭐中级项目TextureView⭐⭐✅✅⭐⭐⭐支持特效场景ExoPlayer⭐⭐⭐✅✅✅⭐⭐⭐⭐短视频/在线视频WebView⭐❌⭐⭐嵌入网页视频
8. 项目常见问题及解答
Q:为什么网络视频无法播放?
👉 检查是否开启 INTERNET 权限;有些视频源不支持明文 HTTP,需要 HTTPS。
Q:播放时黑屏?
👉 对于 MediaPlayer,确保 SurfaceView 或 TextureView 已准备好;ExoPlayer 通常不会有这个问题。
Q:如何支持全屏?
👉 使用 setSystemUiVisibility 或使用 PlayerView 的全屏模式。
9. 扩展方向与性能优化
✅ 使用缓存机制(如 ExoPlayer 的缓存)减少加载时间
✅ 添加倍速播放、进度条控制、弹幕功能
✅ 后台播放/悬浮窗播放
✅ 使用 Service + 通知栏实现后台播放
✅ 视频预加载,优化用户体验