Android实现视频播放的几种实现方式(附带源码)

简介: 1. 项目背景详细介绍 视频播放是 Android 应用中非常常见的功能场景,例如短视频应用、在线视频教育、播放器 App、广告投放、直播回放等。 Andr

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 + 通知栏实现后台播放

✅ 视频预加载,优化用户体验