Răsfoiți Sursa

完善原生demo

杨充 4 ani în urmă
părinte
comite
626c3cde45

+ 4 - 0
VideoKernel/build.gradle

@@ -33,9 +33,13 @@ dependencies {
 
     //谷歌播放器
     implementation  "com.google.android.exoplayer:exoplayer:2.11.3"
+    //exoplayer-core:核心功能 (必要)
     implementation "com.google.android.exoplayer:exoplayer-core:2.11.3"
+    //exoplayer-dash:支持DASH内容
     implementation "com.google.android.exoplayer:exoplayer-dash:2.11.3"
+    //exoplayer-hls:支持HLS内容
     implementation "com.google.android.exoplayer:exoplayer-hls:2.11.3"
+    //exoplayer-smoothstreaming:支持SmoothStreaming内容
     implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:2.11.3"
     implementation "com.google.android.exoplayer:extension-rtmp:2.11.3"
 }

+ 0 - 1
app/build.gradle

@@ -51,7 +51,6 @@ dependencies {
     implementation 'jp.wasabeef:glide-transformations:2.0.1'
 
     //exo的UI库
-    implementation 'com.google.android.exoplayer:exoplayer-core:2.11.3'
     implementation 'com.google.android.exoplayer:exoplayer-ui:2.11.3'
 
     //弹幕

+ 0 - 1
app/src/main/java/org/yczbj/ycvideoplayer/demo/DemoActivity.java

@@ -14,7 +14,6 @@ import org.yczbj.ycvideoplayer.oldPlayer.OldActivity;
 
 public class DemoActivity extends AppCompatActivity implements View.OnClickListener {
 
-
     private TextView mTv1;
     private TextView mTv12;
     private TextView mTv2;

+ 14 - 3
app/src/main/java/org/yczbj/ycvideoplayer/demo/ExoActivity.java

@@ -13,6 +13,7 @@ import com.google.android.exoplayer2.source.ProgressiveMediaSource;
 import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
 import com.google.android.exoplayer2.ui.PlayerView;
 import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
+import com.google.android.exoplayer2.video.VideoListener;
 
 import org.yczbj.ycvideoplayer.ConstantVideo;
 import org.yczbj.ycvideoplayer.R;
@@ -20,6 +21,7 @@ import org.yczbj.ycvideoplayer.R;
 public class ExoActivity extends AppCompatActivity {
 
     private PlayerView mVideoView;
+    private SimpleExoPlayer player;
 
     @Override
     protected void onPause() {
@@ -33,19 +35,28 @@ public class ExoActivity extends AppCompatActivity {
         mVideoView.onResume();
     }
 
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (player!=null){
+            player.release();
+        }
+    }
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_exo_player);
         mVideoView = findViewById(R.id.video_view);
 
-        SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this,new DefaultTrackSelector(),new DefaultLoadControl());
+        SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this,
+                new DefaultTrackSelector(),new DefaultLoadControl());
         player.setPlayWhenReady(true);
         mVideoView.setPlayer(player);
-
         Uri uri = Uri.parse(ConstantVideo.VideoPlayerList[0]);
         DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("user-agent");
-        ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
+        ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(
+                dataSourceFactory).createMediaSource(uri);
         // 播放
         player.prepare(mediaSource);
     }

+ 19 - 12
app/src/main/res/layout/layout_definition_control_view.xml

@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     xmlns:tools="http://schemas.android.com/tools">
 
     <LinearLayout
-        android:id="@+id/bottom_container"
+        android:id="@+id/ll_bottom_container"
         android:layout_width="match_parent"
         android:layout_height="45dp"
         android:layout_gravity="bottom"
@@ -18,10 +19,10 @@
             android:layout_width="45dp"
             android:layout_height="45dp"
             android:padding="12dp"
-            android:src="@drawable/selector_play_button" />
+            android:src="@drawable/selector_bot_play_button" />
 
         <TextView
-            android:id="@+id/curr_time"
+            android:id="@+id/tv_curr_time"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@android:color/white"
@@ -39,6 +40,7 @@
             android:background="@null"
             android:max="1000"
             android:maxHeight="2dp"
+            android:minHeight="2dp"
             android:paddingEnd="0dp"
             android:paddingStart="0dp"
             android:progressDrawable="@drawable/seek_progress"
@@ -46,7 +48,7 @@
             android:thumbOffset="0dp" />
 
         <TextView
-            android:id="@+id/total_time"
+            android:id="@+id/tv_total_time"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@android:color/white"
@@ -57,13 +59,18 @@
             android:id="@+id/tv_definition"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:paddingStart="1dp"
+            android:paddingEnd="4dp"
+            android:layout_marginLeft="8dp"
+            android:text="超清"
             android:textColor="@android:color/white"
             android:textSize="14sp"
-            android:layout_marginLeft="12dp"
-            tools:text="高清" />
+            android:visibility="gone"
+            android:paddingLeft="1dp"
+            android:paddingRight="4dp" />
 
         <ImageView
-            android:id="@+id/fullscreen"
+            android:id="@+id/iv_fullscreen"
             android:layout_width="45dp"
             android:layout_height="45dp"
             android:padding="12dp"
@@ -71,13 +78,13 @@
     </LinearLayout>
 
     <ProgressBar
-        android:id="@+id/bottom_progress"
+        android:id="@+id/pb_bottom_progress"
         style="?android:attr/progressBarStyleHorizontal"
         android:layout_width="match_parent"
-        android:layout_height="1dp"
+        android:layout_height="2dp"
         android:layout_gravity="bottom"
         android:max="1000"
-        android:progressDrawable="@drawable/seek_progress"
+        android:progressDrawable="@drawable/progress_bar_style"
         android:visibility="gone" />
 
-</FrameLayout>
+</FrameLayout>

+ 10 - 6
read/13.视频播放器如何选择.md

@@ -46,13 +46,17 @@
 	* 在使用的时候我们根据不同的需求创建对应的 RendererBuilder,然后将 RendererBuilder 传递给 DemoPlayer 然后调用 DemoPlayer 的 setPlayWhenReady 方法。
 - 优缺点
     * ExoPlayer 相较于 MediaPlayer 有很多很多的优点:
-        * 支持动态的自适应流 HTTP (DASH) 和 平滑流,任何目前 MediaPlayer 支持的视频格式(同时它还支持 HTTP 直播(HLS),MP4,MP3,WebM,M4A,MPEG-TS 和 AAC)。
-        * 支持高级的 HLS 特性,例如正确处理 EXT-X-DISCONTINUITY 标签;
-        * 支持自定义和扩治你的使用场景。ExoPlayer 专门为此设计;
-        * 便于随着 App 的升级而升级。因为 ExoPlayer 是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级;
-        * 更少的适配性问题。
+        - 1,支持DASH和SmoothStreaming这两种数据格式的资源,而MediaPlayer对这两种数据格式都不支持。它还支持其它格式的数据资源,比如MP4, M4A, FMP4, WebM, MKV, MP3, Ogg, WAV, MPEG-TS, MPEG-PS, FLV and ADTS (AAC)等
+        - 2,支持高级的HLS特性,比如能正确的处理#EXT-X-DISCONTINUITY标签
+        - 3,无缝连接,合并和循环播放多媒体的能力
+        - 4,和应用一起更新播放器(ExoPlayer),因为ExoPlayer是一个集成到应用APK里面的库,你可以决定你所想使用的ExoPlayer版本,并且可以随着应用的更新把ExoPlayer更新到一个最新的版本。
+        - 5,较少的关于设备的特殊问题,并且在不同的Android版本和设备上很少会有不同的表现。
+        - 6,在Android4.4(API level 19)以及更高的版本上支持Widevine通用加密
+        - 7,为了符合你的开发需求,播放器支持自定义和扩展。其实ExoPlayer为此专门做了设计,并且允许很多组件可以被自定义的实现类替换。
+        - 8,使用官方的扩展功能可以很快的集成一些第三方的库,比如IMA扩展功能通过使用互动媒体广告SDK可以很容易地将视频内容货币化(变现)
     * ExoPlayer 的缺点:
-        * ExoPlayer 的音频和视频组件依赖 Android 的 MediaCodec 接口,该接口发布于 Android4.1(API 等级 16)。因此它不能工作于之前的Android 版本。
+        - ExoPlayer 的音频和视频组件依赖 Android 的 MediaCodec 接口,该接口发布于 Android4.1(API 等级 16)。因此它不能工作于之前的Android 版本。
+        - 在某些设备上播放音频,ExoPlayer可能会比MediaPlayer消耗更多的电量
 
 
 

+ 75 - 0
read/14.视频播放器简单案例.md

@@ -0,0 +1,75 @@
+# 13.视频播放器如何选择
+#### 目录介绍
+- 01.Android原生VideoView
+- 02.Google的ExoPlayer
+- 03.Vitamio视频播放框架
+- 04.B站的框架ijkplayer
+- 05.腾讯视频播放器框架
+
+
+### 01.Android原生VideoView
+
+
+
+
+### 02.Google的ExoPlayer
+- 根据自己的需求选择性添加依赖,如核心库和UI库,这两个可以满足基本上的视频播放需求:
+    ``` java
+    implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
+    implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'
+    ```
+- 整个ExoPlayer库包含5个字库,依赖5个子库和依赖整个库效果是一样的。
+    ``` java
+    exoplayer-core:核心功能 (必要)
+    exoplayer-dash:支持DASH内容
+    exoplayer-hls:支持HLS内容
+    exoplayer-smoothstreaming:支持SmoothStreaming内容
+    exoplayer-ui:用于ExoPlayer的UI组件和相关的资源。
+    ```
+- 在布局中引用代码
+    ``` java
+    <com.google.android.exoplayer2.ui.PlayerView
+       android:id="@+id/video_view"
+       android:layout_width="match_parent"
+       android:layout_height="match_parent"/>
+    ```
+- 代码如何使用,超级简单
+    ``` java
+    SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this,
+            new DefaultTrackSelector(),new DefaultLoadControl());
+    player.setPlayWhenReady(true);
+    mVideoView.setPlayer(player);
+    Uri uri = Uri.parse(ConstantVideo.VideoPlayerList[0]);
+    DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("user-agent");
+    ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(
+            dataSourceFactory).createMediaSource(uri);
+    // 播放
+    player.prepare(mediaSource);
+    ```
+
+
+
+
+### 03.Vitamio视频播放框架
+
+
+### 04.B站的框架ijkplayer
+
+
+
+
+### 05.腾讯视频播放器框架
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 34 - 0
read/15.视频播放器流程分析.md

@@ -0,0 +1,34 @@
+# 15.视频播放器流程分析
+#### 目录介绍
+- 01.视频播放的流程图
+- 02.流程图简单分析
+
+
+
+### 01.视频播放的流程图
+- 常规的视频播放分为传输,解封装,解码,绘制四个步骤,以下按播放网站上(HTTP)的mp4文件为例,简单介绍一下几个过程:
+    - ![image](https://img-blog.csdnimg.cn/20201013114850247.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+
+
+
+### 02.流程图简单分析
+- HTTP传输
+    - 播放器使用HTTP协议把MP4下载下来,这部分需求一般需要边下边播,服务器的HttpServer一定要支持HTTP Seek,因为播放的过程中需要跳转到不同的位置下载内容,比如MP4结构中的moov元数据信息在很多视频文件中都被放置在文件末尾了。
+- MP4解封包
+    - 这部分我们常见的封包格式就是mp4, 视频编码后h264数据被拆分为多个片段封包到mp4中,解封包就是从mp4中解析出h264视频裸码流的过程。需要对Mp4格式有更多了解……
+- H264解码
+    - 视频解码就是将h264裸码流解析成视频像素数据的过程(一般是yuv,也可以是rgba,类似于将jpg图片解码为bitmap数据。h264格式可以使用Android系统提供MediaCoder硬解码,也可以使用FFMpeg进行软解码。
+- OpenGL绘制
+    - 就是绘制就是将解析为yuv格式的视频数据绘制到屏幕上的过程,一般使用OpenGL绘制。OpenGL相关绘制的知识点相对比较复杂,不太懂
+
+
+
+
+
+
+
+
+
+
+
+