代码:http://download.youkuaiyun.com/detail/huangbin95487710/9260589
依赖包模式
完整运行还需要用到以下依赖包
- 特性配置支持
- 使用代理缓存,播放完一次自动缓存至SDCARD
- 从头开始
- 在第一帧显示的时候出现菜单
- 在第一帧显示的时候暂停
- 循环次数
- 循环播放
- 重启模式播放
- 播放assets或sdcard或http视频文件
- 播放地址
- 第一帧图片地址
- Intent关键字参照下面列表
/*** 链接地址 */ public static final String KEY_URL = "key_url"; /*** 图片链接地址 */ public static final String KEY_IMAGE = "key_image"; /*** 频道地址 */ public static final String KEY_CHANNEL = "key_channel"; /*** 锁屏状态 */ public static final String KEY_LOCKSCREEN = "key_lockscreen"; /*** 文件名称 */ public static final String KEY_DISPLAYNAME = "key_displayname"; /*** 是否使用代理缓存 */ public static final String KEY_USE_PROXY_CACHE = "key_use_proxy_cache"; /*** 是否从头开始 */ public static final String KEY_FROMSTART = "key_fromstart"; /*** 在第一帧显示的时候出现菜单 */ public static final String KEY_FRAME_SHOW_MENU = "key_frame_show_menu"; /*** 在第一帧显示的时候暂停 */ public static final String KEY_FRAME_SHOW_PAUSE = "key_frame_show_pause"; /*** 跳转位置 */ public static final String KEY_STARTPOSITION = "key_startposition"; /*** 循环次数 */ public static final String KEY_LOOPCOUNT = "key_loopcount"; /*** 循环播放 */ public static final String KEY_AUTOPLAY = "key_autoplay"; /*** 重启模式播放 */ public static final String KEY_REOPEN_PLAY = "key_reopen_play"; /*** 字幕路径 */ public static final String KEY_SUBPATH = "key_subpath"; /*** 字幕处于下方 */ public static final String KEY_SUBSHOWN = "key_subshown"; public static final String KEY_HWCODEC = "key_hwcodec"; /*** 同步播放 */ public static final String KEY_SYNCHRONIZATION = "key_synchronization";
- AndroidManifest.xml添加配置
<!-- ###################视频播放器################### --> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- ###################视频播放器################### --> <application android:hardwareAccelerated="true" android:largeHeap="true" > <!-- ###################视频播放器################### --> <activity android:name="app.general.lib.VideoActivity" android:configChanges="orientation|keyboard|keyboardHidden|navigation" android:launchMode="singleTop" android:process=":videoplayere" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" > </activity> <service android:name="app.general.lib.VideoPlayerService" android:process=":videoplayere" /> <!-- ###################视频播放器################### --> </application>
- 示例代码
- 布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <include android:layout_width="fill_parent" android:layout_height="200dip" android:layout_gravity="center" layout="@layout/video" > </include> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF" android:divider="#EEEEEE" android:dividerHeight="1dp" /> </LinearLayout>
- 代码
package cn.whonow.whonow.video; import java.util.ArrayList; import java.util.Arrays; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import app.general.lib.video.ChannelBase; import app.general.lib.video.VideoPlayer; import cn.whonow.whonow.R; import cn.whonow.whonow.TestItem; /** * 视频播放列表模式 * */ public class VideoListActivity extends Activity implements OnItemClickListener { private ListView mListView; private ClassAdapter adapter; public final static ArrayList<TestItem> mWork = new ArrayList<TestItem>( Arrays.asList( new TestItem("在线mp4视频", "http://akkacn.org:9999/upload/video/2015/03/24/2015032418360012345.mp4"),// new TestItem("新闻频道", VideoPlayer.ASSET_PATH + "1.mp4"),// new TestItem("游戏直播", "http://gslb.tv.sohu.com/live?cid=219394&type=hls"),// new TestItem( "国外MP4 640x360 需VPN", "http://player.vimeo.com/external/81044091.sd.mp4?s=cb11c10cddd92416921f74ad37b7a555"),// new TestItem( "国外MP4 480x270 需VPN", "http://player.vimeo.com/external/81044091.mobile.mp4?s=9f1adeda9befcc9f802a76856b0c52af"),// new TestItem( "国外HTTP m3u8 需VPN", "http://player.vimeo.com/external/81044091.m3u8?p=high,standard,mobile&s=6b5ac38a1c25281020105d5ce81f4e00")// )); public final static String DEFAULT_URL = VideoPlayer.ASSET_PATH + "test.mp4"; public final static ArrayList<ChannelBase> mChannel = new ArrayList<ChannelBase>( Arrays.asList(new ChannelBase("镜头一", DEFAULT_URL),// new ChannelBase("镜头二", VideoPlayer.ASSET_PATH + "1.mp4")// )); private Context context; private int position; private VideoPlayer mPlayer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_video_list); context = this; /** 设置播放器属性 */ getIntent().putExtra(VideoPlayer.KEY_FROMSTART, true); getIntent().putExtra(VideoPlayer.KEY_FRAME_SHOW_MENU, true); getIntent().putExtra(VideoPlayer.KEY_FRAME_SHOW_PAUSE, true); getIntent() .putExtra(VideoPlayer.KEY_IMAGE, "http://img.zcool.cn/community/031dc4855a676ac00000177a0951932.jpg"); getIntent().putExtra(VideoPlayer.KEY_USE_PROXY_CACHE, false); mListView = (ListView) findViewById(R.id.listView); mListView.setOnItemClickListener(this); adapter = new ClassAdapter(); mListView.setAdapter(adapter); adapter.notifyDataSetChanged(); mPlayer = new VideoPlayer(this); mPlayer.setDataChannel(mChannel); /** 设置同步 */ mPlayer.setSyn(true); // http://live-ws.huomaotv.com/live/testtest.flv mPlayer.play(DEFAULT_URL); } @Override public void onResume() { super.onResume(); if (mPlayer != null) { mPlayer.onResume(); } } @Override public void onPause() { super.onPause(); if (mPlayer != null) { mPlayer.onPause(); } } @Override public void onStop() { super.onStop(); if (mPlayer != null) { mPlayer.onStop(); } } @Override public void onDestroy() { super.onDestroy(); if (mPlayer != null) { mPlayer.onDestroy(); } } @Override public void onConfigurationChanged(Configuration newConfig) { if (mPlayer != null) { mPlayer.onConfigurationChanged(newConfig); } super.onConfigurationChanged(newConfig); } @Override protected void onSaveInstanceState(Bundle outState) { if (mPlayer != null) { mPlayer.onSaveInstanceState(outState); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub this.position = position; if (mPlayer != null) { mPlayer.stopPlayer(); } String url = mWork.get(position).mUrl; mPlayer.play(url); } public class ClassAdapter extends BaseAdapter { private LayoutInflater mInflater; public ClassAdapter() { mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return mWork.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mWork.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub ViewHolder holder; if (convertView == null) { /* 使用自定义的file_row作为Layout */ holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.test_main_item, null); holder.name = (TextView) convertView.findViewById(R.id.name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText((position + 1) + "." + mWork.get(position).mName); return convertView; } /* class ViewHolder */ public class ViewHolder { TextView name; } } }
- 全屏播放调用
String url = mEditText.getText().toString(); path = VideoListActivity.DEFAULT_URL; Intent intent = new Intent(); intent.setClass(this, VideoActivity.class); intent.putExtra(VideoPlayer.KEY_CHANNEL, VideoListActivity.mChannel); intent.putExtra(VideoPlayer.KEY_AUTOPLAY, true); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
- 效果图
- 小窗口播放
- 全屏播放
本文档介绍了Android快速SDK中的VideoPlayerE组件,提供了依赖包配置、视频播放特性和配置项,包括代理缓存、播放控制等。通过示例代码展示了如何在布局和活动中使用该组件,实现视频播放列表功能。
6382





