android之视频播放
视频播放和音频播放一样,都是使用MediaPlayer来播放的,区别就是MediaPlayer播放视频时是直接在Activity中实现的,而音频播放则需要写到服务中去。使用MediaPlayer只支持MP4和3gp格式的文件,如果想要播放其他格式的文件需要使用第三方库,这里推荐使用vitamio
MediaPlayer
使用MediaPlayer类来播放视频文件
布局文件
在布局文件中使用了SurfaceView控件来显示视频,该控件是为显示视频而生的。SurfaceView有一个很不好的特性就是。当Activity变为后台时该对象会被直接销毁,而Activity切换到前台时该对象会重新被创建。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/player" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Activity
在Activity中获取SuerfaceView对象,创建MediaPlayer对象,进行一些设置后调用mp.setDisplay()方法就可以通过SurfaceView对象来显示视频。由于构建SuerfaceView对象比较耗时,所以播放的设置应该放置在其构建完成后的回调函数中去。SurfaceView对象被销毁后会调用surfaceDestroyed方法
package xidian.dy.com.chujia; import android.media.MediaPlayer; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; public class MainActivity extends AppCompatActivity { MediaPlayer mp; int current; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SurfaceView sv = (SurfaceView) findViewById(R.id.player); SurfaceHolder sh = sv.getHolder(); sh.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { if(mp == null){ mp = new MediaPlayer(); mp.reset(); try { mp.setDataSource("/sdcard/a.mp4"); mp.setDisplay(holder); mp.prepare(); mp.start(); mp.seekTo(current); } catch (IOException e) { e.printStackTrace(); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { if(mp != null){ current = mp.getCurrentPosition(); mp.stop(); mp.release(); mp=null; } } }); } }
还有一个API叫VideoView,也可以通过他来进行视频的播放,VideoView只是将MediaPlayer和SurfaceView结合起来而已,并没有做过多的扩展。由于这两个API支持的视频格式有限,所以在开发中用的很少。
Vitamio
这是一个第三方的开源框架,github地址https://github.com/yixia/VitamioBundle
在AS下的导入Vitamio方式:http://www.cnblogs.com/happyhacking/p/5365192.html
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <io.vov.vitamio.widget.VideoView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/vv"/> </LinearLayout>
Activity
package xidian.dy.com.chujia; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.util.Log; import java.io.File; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.VideoView; public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this)) return; VideoView vv = (VideoView) findViewById(R.id.vv); File f = new File(Environment.getExternalStorageDirectory(), "a.avi"); Log.e("path", f.getPath()); if(vv != null){ vv.setVideoPath(f.getPath()); vv.start(); vv.setMediaController(new MediaController(this)); } } }
清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xidian.dy.com.chujia"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="主界面"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation" android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" /> </application> </manifest>
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步