瀏覽代碼

完善视频播放器内核库

yangchong 3 年之前
父節點
當前提交
f4f869901e
共有 2 個文件被更改,包括 180 次插入9 次删除
  1. 25 9
      README.md
  2. 155 0
      ReadMeWiki/00.方案实践/13.语音播报方案设计实践.md

+ 25 - 9
README.md

@@ -125,15 +125,28 @@
 #### 4.1 关于gradle引用说明
 - 如下所示
     ```
-    //视频UI层,必须要有
-    implementation 'cn.yc:VideoPlayer:3.1.0'
-    //视频缓存,如果不需要则可以不依赖
-    implementation 'cn.yc:VideoCache:3.0.5'
+    //视频UI层,必须有
+    implementation 'com.github.yangchong211.YCVideoPlayer:VideoPlayer:1.1.0'
     //视频内核层,必须有
-    implementation 'cn.yc:VideoKernel:3.0.6'
-    //视频播放器播放位置记录,选择性添加
-    implementation 'cn.yc:VideoSqlLite:1.0.2'
+    implementation 'com.github.yangchong211.YCVideoPlayer:VideoKernel:1.1.0'
     ```
+- 视频播放库系列库
+    |**视频封装库类依赖** | 功能说明 |
+    |--------   |-----        |
+    |**com.github.yangchong211.YCVideoPlayer:VideoPlayer:1.1.0** | 视频播放器库(UI) |
+    |**com.github.yangchong211.YCVideoPlayer:VideoKernel:1.1.0** | 视频播放器内核(ijk,exo,media,其他) |
+    |**com.github.yangchong211.YCVideoPlayer:VideoView:1.1.0** | 视频播放悬浮窗,全局悬浮,单个activity悬浮 |
+    |**com.github.yangchong211.YCVideoPlayer:MusicPlayer:1.1.0** | 音频播放器库 |
+    |**com.github.yangchong211.YCVideoPlayer:VideoM3u8:1.1.0** | m3u8库 |
+    |**com.github.yangchong211.YCVideoPlayer:VideoSqlLite:1.1.0** | 视频播放位置记录,二级缓存库 |
+    |**com.github.yangchong211.YCVideoPlayer:AudioPlayer:1.1.0** | 语音文字类播放器 |
+    |**com.github.yangchong211.YCVideoPlayer:VideoCache:1.1.0** | 边播边缓存库 |
+- 开发中或抽取中,待上传库
+    |**com.github.yangchong211.YCVideoPlayer:VideoScreen:1.1.0** | 视频截图和GIF截图 |
+    |**com.github.yangchong211.YCVideoPlayer:VideoRecorder:1.1.0** | 视频录频 |
+    |**com.github.yangchong211.YCVideoPlayer:VideoMonitor:1.1.0** | 视频监控库 |
+
+
 
 #### 4.2 在xml中添加布局
 - 注意,在实际开发中,由于Android手机碎片化比较严重,分辨率太多了,建议灵活设置布局的宽高比为4:3或者16:9或者你认为合适的,可以用代码设置。
@@ -221,8 +234,11 @@
 
 
 #### 6.4 视频内核lib库介绍
-![image](https://img-blog.csdnimg.cn/2020101309293329.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
-![image](https://img-blog.csdnimg.cn/2020101321464162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+- 视频播放器内核架构图
+    - ![image](https://img-blog.csdnimg.cn/2020101309293329.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+    - ![image](https://img-blog.csdnimg.cn/2020101321464162.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NzAwMjc1,size_16,color_FFFFFF,t_70#pic_center)
+- 视频播放器内核UML类图
+    - ![image](https://img-blog.csdnimg.cn/057b630ff4f4437b92ad71c52c70b575.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2o5YWF,size_20,color_FFFFFF,t_70,g_se,x_16)
 
 
 

+ 155 - 0
ReadMeWiki/00.方案实践/13.语音播报方案设计实践.md

@@ -0,0 +1,155 @@
+# TTS音频播放基础
+#### 目录介绍
+- 01.TTS简单的描述
+- 02.TTS简单的案例
+- 03.TTS播报监听处理
+- 04.TTS播报异常分析
+- 05.TTS播放音频案例
+- 06.TTS播放测试用例
+- 08.TTS接口设计架构
+
+
+
+
+
+### 01.TTS简单的描述
+- TTS全称Text  To Speech ,是文本转语音服务
+
+
+
+### 02.TTS简单的案例
+#### 2.1 初始化tts
+- 代码如下所示
+    ```
+    textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
+        @Override
+        public void onInit(int status) {
+            if (!mReady  && (TextToSpeech.SUCCESS == status) && textToSpeech != null) {
+                VideoLogUtils.i("Initialize TTS success");
+                //获取locale
+                final Locale locale = mContext.getApplicationContext()
+                        .getResources().getConfiguration().locale;
+                if (locale != null) {
+                    VideoLogUtils.i("tts isLanguageAvailable " + mTts.isLanguageAvailable(locale) +
+                            "; variant is " + locale.getVariant() +
+                            "; locale is " + locale + " ; country  is " + locale.getCountry());
+                }
+                //设置朗读语言
+                int setLanguage = this.textToSpeech.setLanguage(null != locale ? locale : Locale.getDefault());
+                switch (setLanguage) {
+                    case TextToSpeech.LANG_MISSING_DATA:
+                        VideoLogUtils.i("TTS set language: Language missing data");
+                        break;
+                    case TextToSpeech.LANG_NOT_SUPPORTED:
+                        VideoLogUtils.i("TTS set language: Language not supported");
+                        break;
+                    case TextToSpeech.LANG_AVAILABLE:
+                        VideoLogUtils.i("TTS set language: Language available");
+                        break;
+                    case TextToSpeech.LANG_COUNTRY_AVAILABLE:
+                        VideoLogUtils.i("TTS set language: Language country available");
+                        break;
+                    case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
+                        VideoLogUtils.i("TTS set language: Language country var available");
+                        break;
+                    default:
+                        VideoLogUtils.i("TTS set language: Unknown error");
+                        break;
+                }
+            } else if (TextToSpeech.ERROR == status) {
+                VideoLogUtils.i("Initialize TTS error");
+            } else {
+                VideoLogUtils.i("Initialize TTS error");
+            }
+        }
+    });
+    ```
+
+
+#### 2.2 如何进行初始化
+- 如何进行播放?
+    ```
+    textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
+    ```
+- 循环播放语音
+    - 想让他报个2-3遍或者循环播报的时候,我们来试一下
+    ```
+    for (int i=0 ; i<5 ; i++){
+        textToSpeech.speak("简单播放tts,"+i, TextToSpeech.QUEUE_FLUSH, null);
+    }
+    ```
+    - 简单的不行,但是问题来了,一段长的文字他只播报前面几个字,然后又重新开始播报。
+    - 这是因为textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);这个方法会自动关闭掉上面一个播报的内容,从而进行新一轮的播报。
+- 播放完成后再播放
+    - 要等上一条播报完整了再进行播报,该如何操作呢?那么可以TTS有 isSpeaking() 这个方法
+    ```
+    for (int i=0 ; i<5 ; i++){
+        if (!textToSpeech.isSpeaking()){
+            textToSpeech.speak("简单播放tts,"+i, TextToSpeech.QUEUE_FLUSH, null);
+        }
+    }
+    ```
+    - 这样就可以播全了嘛? 非也,for循环飞快的跑只要发现在speaking那么直接跳过开始走下一个i
+- 如何正确循环播放
+    ```
+    for (int i=0 ; i<5 ; i++){
+        textToSpeech.speak("简单播放,"+i, TextToSpeech.QUEUE_ADD, null);
+    }
+    ```
+    - 这样就相当于在一个消息队列然后进行循环的播报。
+
+
+### 03.TTS播报监听处理
+- 关于监听tts状态如下所示:
+    ```
+    private final class OnCompleteListener extends UtteranceProgressListener {
+    
+        OnCompleteListener() {
+    
+        }
+    
+        /**
+         * 播放完成。这个是播报完毕的时候 每一次播报完毕都会走
+         * @param utteranceId                       话语id
+         */
+        @Override
+        public void onDone(final String utteranceId) {
+            VideoLogUtils.i("TTSPlayer OnCompleteListener onDone");
+            onCompleted();
+        }
+    
+        /**
+         * 播放异常
+         * @param utteranceId                       话语id
+         */
+        @Override
+        public void onError(final String utteranceId) {
+            VideoLogUtils.i("TTSPlayer OnCompleteListener onError");
+            stop();
+            onError("TTSPlayer has play fail : " + utteranceId);
+            onCompleted();
+        }
+    
+        /**
+         * 播放开始。这个是开始的时候。是先发声之后才会走这里
+         * 调用isSpeaking()方法在这为true
+         * @param utteranceId                       话语id
+         */
+        @Override
+        public void onStart(final String utteranceId) {
+    
+        }
+    }
+    ```
+
+
+### 08.TTS接口设计架构
+
+
+### 参考
+- https://blog.csdn.net/qq_30359699/article/details/105388575
+- https://blog.csdn.net/awodefengduanwu/article/details/105683306
+
+
+
+