gif 显示有点卡,帧数低,实际很流畅
Скачать предварительный просмотр apk
repositories {
jcenter()
mavenCentral();
}
dependencies {
// полная версия
compile 'com.ycjiang:VideoPlayModule:2.1.91'
// упрощённая версия (без smoothstreaming, dash, hls, только обычные функции потоковой передачи)
compile 'com.ycjiang:VideoPlayModule-Lite:2.1.91'
}
Примечание: если не удаётся нормально сослаться, пожалуйста, добавьте следующий код в repositories{ } mavenCentral(url: "https://dl.bintray.com/ycjiang/ycjiang")
Основное использование следующее
<chuangyuan.ycj.videolibrary.widget.VideoPlayerView
android:id="@+id/exo_play_context_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent" />
1. Свойства элемента управления
<chuangyuan.ycj.videolibrary.widget.VideoPlayerView
android:id="@+id/exo_play_context_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:controller_layout_id="@layout/simple_exo_playback_control_view"
app:player_layout_id="@layout/simple_exo_view"
app:player_replay_layout_id="@layout/custom_play_replay"
app:player_error_layout_id="@layout/custom_play_error"
app:player_hint_layout_id="@layout/custom_play_btn_hint"
app:player_load_layout_id="@layout/custom_exo_play_load"
app:player_gesture_audio_layout_id="@layout/custom_gesture_audio"
app:player_gesture_bright_layout_id="@layout/custom_gesture_brightness"
app:player_gesture_progress_layout_id="@layout/custom_gesture_pro"
app:preview_layout_id="@layout/exo_default_preview_layout"
app:resize_mode="fit"
app:show_timeout="3000"
app:surface_type="texture_view"
app:fastforward_increment="0"
app:rewind_increment="0"
app:user_watermark="@mipmap/watermark_big"
app:list="true"
app:use_controller="true"
app:fullscreen_image_selector="@drawable/custom_full_selector"
app:back_image="@drawable/ic_back_custom" />
``` | enum | 视频缩放渲染显示方式一共4种 |
| | reference | 1.fit 正常模式 |
| | reference | 2.fixed_width 保持的是视频宽度,拉伸视频高度 |
| | reference | 3.fixed_height 保持的是视频高度,拉伸视频宽度 |
| | reference | 4.fill 全屏模式,拉伸视频宽高 |
| player_layout_id | reference | (播放器布局):目前默认布局 simple_exo_view.xml |
| controller_layout_id | reference | 控制器布局 默认有四种布局 |
| | reference | 1.simple_exo_playback_control_view.xml 视频封面控制布局下面,(默认) |
| | reference | 2.simple_exo_playback_list_view.xml.xml 在列表播放使用控制布局 |
| | reference | 3.simple_exo_playback_top_view.xml.xml 视频封面控制布局上面 |
| | reference | 4.exo_playback_control_view.xml exo 提供默认风格 |
| player_replay_layout_id | reference | 设置 自定义重播布局文件 |
| player_error_layout_id | reference | 设置 自定义错误布局文件 |
| player_hint_layout_id | reference | 设置 自定义非wifi提示布局文件 |
| player_load_layout_id | reference | 设置 自定义视频加载布局文件 |
| player_gesture_audio_layout_id | reference | 设置 自定义手势音频调节布局 |
| player_gesture_bright_layout_id | reference | 设置 自定义手劳亮度调节布局 |
| player_gesture_progress_layout_id | reference | 设置 自定义手劳进度调节布局 |
| player_preview_layout_id | reference | 设置 自定义封面图布局(默认 exo_default_preview_layout.xml) |
| player_list | boolean | 设置 是否指定列表播放 默认 false true 列表播放 |
| player_fullscreen_image_selector | reference | 设置 自定义全屏按钮selector |
| player_back_image | reference | 设置 自定义返回按钮图标 |
| default_artwork | reference | 设置 封面占位图 |
| show_timeout | integer | 设置 控制布局隐藏时间 默认值为3秒 |
| fastforward_increment | integer | 设置 按钮设置快进增量,以毫秒为单位(exo控制布局使用) |
| rewind_increment | integer | 设置 按钮设置快退增量,以毫秒为单位(exo控制布局使用) |
| user_watermark | reference | 设置 水印图片 默认在右上角 | **4. Изменить текст в диалоговом окне сети**
app.strings.xml:
Вы используете сеть, отличную от Wi-Fi. Продолжить просмотр видео? Подсказка
**5. В функциональном списке AndroidManifest.xml**:
добавить «android:configChanges="orientation|keyboardHidden|screenSize"» к узлу activity:
```
<activity android:name="chuangyuan.ycj.yjplay.MainListActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait">
```
### 3. Код на Java
* **1. Классы управления воспроизведением:**
- ExoUserPlayer — базовый класс для воспроизведения, реализует базовое воспроизведение и устанавливает setPlayUri();
- GestureVideoPlayer — воспроизведение с возможностью управления жестами (регулировка яркости и видеопрогресса, а также громкости);
- ManualPlayer — запуск воспроизведения при нажатии кнопки, имеет функции управления жестами и воспроизведения из списка.
* **2. Методы VideoPlayerView:**
| Название | Тип | Описание |
| --- | --- | --- |
| setTitle("Заголовок") | void | Устанавливает заголовок видео |
| setExoPlayWatermarkImg(R.mipmap.watermark_big) | void | Добавляет изображение водяного знака |
| setPreviewImage(Bitmap) | void | Устанавливает изображение обложки |
| setPreviewImage(R.res.image) | void | Устанавливает изображение обложки |
| getPreviewImage() | ImageView | Возвращает элемент управления изображением обложки |
* **3. Пример кода для воспроизведения:**
ExoUserPlayer exoPlayerManager = new VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_MANUAL, videoPlayerView) .setDataSource(new DataSource(this)) // Загрузка видео по протоколу RTMP .setPlayUri("rtmp://live.hkstv.hk.lxdns.com/live/hks") // Загрузка M3U8 .setPlayUri("http://dlhls.cdn.zhanqi.tv/zqlive/35180_KUDhx.m3u8") // Загрузка TS-файла .setPlayUri("http://185.73.239.15:25461/live/1/1/924.ts") // Воспроизведение локального видео .setPlayUri("/storage/emulated/0/DCIM/Camera/VID_20170717_011150.mp4") // Воспроизведение видео из списка .setPlayUri(listss); // Установка начальной позиции воспроизведения .setPosition(1000) // Пример локального пути или /storage/emulated/0/DCIM/Camera/VID_20180215_131926.mp4 .setPlayUri(Environment.getExternalStorageDirectory().getAbsolutePath()+"/VID_20170925_154925.mp4") // Включение настройки линии .setShowVideoSwitch(true) .setPlaySwitchUri(0,test,name) .setPlaySwitchUri(0, 0, getString(R.string.uri_test_11), Arrays.asList(test), Arrays.asList(name)) // Настройка скорости воспроизведения (ускорение и замедление) .setPlaybackParameters(0.5f, 0.5f) // Блокировка панели поиска для перемотки (например, в рекламных видео) .setSeekBarSeek(false) // Циклическое воспроизведение .setLooping(10) // Обратные вызовы прогресса видео .addOnWindowListener(new VideoWindowListener() { @Override
**Внимание:**
1. *exoPlayerManager.setPlayUri(Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.h264");* — локальное видео.
2. **Настройка многолинейного воспроизведения:**
* включить настройку многолинейного воспроизведения, по умолчанию она отключена;
* *exoPlayerManager.setShowVideoSwitch(true);*
* поддержка списка List;
* String [] test={"http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4", "http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4", http://120.25.246.21/vrMobile/travelVideo/zhejiang_xuanchuanpian.mp4};*
* String[] name={"超清","高清","标清"};*
* *exoPlayerManager.setPlaySwitchUri(0,test,name);*
* настройка для нескольких разрешений и рекламного видео;
* *exoPlayerManager.setPlaySwitchUri(0, 0, getString(R.string.uri_test_11), Arrays.asList(test), Arrays.asList(name));*
3. **Предварительный просмотр рекламного видео (легко реализовать):**
* /***необходимо добавить параметры**/*
* первый параметр представляет собой индекс местоположения рекламного видео;
* *exoPlayerManager.setPlayUri(0, "http://mp4.vjshi.com/2013-07-25/2013072519392517096.mp4", "http://mp4.vjshi.com/2013-11-11/1384169050648_274.mp4");*
* если вы обрабатываете видео во время воспроизведения самостоятельно. Реализуйте этот интерфейс обратного вызова;
* обработка обратного вызова при переключении видео, выполнение компоновки, управление компоновкой отображения;
* *exoPlayerManager.setOnWindowListener(new VideoWindowListener() {*
* @Override*
* public void onCurrentIndex(int currentIndex, int windowCount) {*
* if (currentIndex == 0) {*
* //скрыть управление компоновкой*
* exoPlayerManager.hideControllerView();*
* //если скрыть управление компоновкой, но необходимо отобразить полноэкранную кнопку. Показать вручную, восстановить автоматически при воспроизведении. Не нужно выходить*
* videoPlayerView.getExoFullscreen().setVisibility(View.VISIBLE);*
*} else {*
* //восстановить управление компоновкой*
* exoPlayerManager.showControllerView();*
*}*
*}*
});*
* пропустить операцию с рекламным видео;
* *exoPlayerManager.next();*
4. **Настроить обработку нажатия кнопки воспроизведения:**
* *exoPlayerManager.setOnPlayClickListener(new View.OnClickListener() {*
* @Override*
* public void onClick(View v) {*
* Toast.makeText(MainCustomActivity.this,"Определение события нажатия на кнопку воспроизведения",Toast.LENGTH_LONG).show();*
* //обработка бизнес-операций после завершения*
* exoPlayerManager.startPlayer();//начать воспроизведение*
*}*
});*
5. **Назначить прослушивание обратного вызова VideoInfoListener:**
* *exoPlayerManager.addVideoInfoListener(new VideoInfoListener() {*
* @Override*
* public void onPlayStart() {*
* //начало воспроизведения*
*}*
*@Override*
*public void onLoadingChanged() {*
*//изменение загрузки*
*}*
*@Override*
*public void onPlayerError(ExoPlaybackException e) {*
*//ошибка загрузки*
*}*
*@Override*
*public void onPlayEnd() {*
*//завершение воспроизведения*
*}*
*@Override*
*public void onRepeatModeChanged(int repeatMode) {*
*//изменение режима*
*}*
*});*
6. **Переписать методы Activity и Fragment жизненного цикла:**
* *Override*
*public void onResume() {*
*super.onResume();*
*exoPlayerManager.onResume();*
*}*
*@Override*
*public void onPause() {*
*super.onPause();*
*exoPlayerManager.onPause();*
*}*
*@Override*
*protected void onDestroy() {*
*exoPlayerManager.onDestroy();*
*super.onDestroy();*
*}*
*@Override*
*public void onConfigurationChanged(Configuration newConfig) {*
*exoPlayerManager.onConfigurationChanged(newConfig);//переключение между горизонтальным и вертикальным экраном*
*super.onConfigurationChanged(newConfig);* ### Три. [Список использования —> нажать на меня](RELEASEVIDEO_LIST.md)
### Четыре. Классы фабрики источников данных
#### 1. Источники данных по умолчанию
* Кэш: CacheDataSourceFactory
* HTTP: DefaultDataSourceFactory, DefaultHttpDataSourceFactory
* Приоритет: PriorityDataSourceFactory
#### 2. Пользовательские источники данных ExoPlayer (выбрать в соответствии с требованиями)
compile 'com.google.android.exoplayer:extension-okhttp:2.8.2'
compile 'com.google.android.exoplayer:extension-rtmp:2.8.2'
compile 'com.google.android.exoplayer:extension-gvr:2.8.2'
compile 'com.google.android.exoplayer:extension-cast:2.8.2'
compile 'com.google.android.exoplayer:extension-mediasession:2.8.2'
compile 'com.google.android.exoplayer:extension-ima:2.8.2'
compile 'com.google.android.exoplayer:extension-leanback:2.8.2'
### Пять. [Использование пользовательских источников данных —> нажать на меня](RELEASESOURCE.md)
### Шесть. [Использование настраиваемых макетов —> нажать на меня](READMELAYOUT.md)
### Семь. [Использование пользовательского MediaSource —> нажать на меня](RELEASEVIDEO.md)
### Восемь. [Использование кэширования, шифрования и обработки видео —> нажать на меня](README_EN_VIDEO.md)
### Запутывание
-dontwarn chuangyuan.ycj.**
-keep class chuangyuan.ycj.** { *;}
## [Лицензия](https://github.com/yangchaojiang/yjPlay/blob/master/LICENSE)
Лицензия Apache версии 2.0 («Лицензия»);
вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
Вы можете получить копию Лицензии по адресу:
http://www.apache.org/licenses/LICENSE-2.0
Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по Лицензии, предоставляется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующего разрешения и ограничения по Лицензии.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )