作者:root
Android使用讯飞语记引擎实现中文TTS
1.首先去讯飞语记官网下载并安装APP:
http://www.iyuji.cn/iyuji/home
2.设置语音引擎:
设置==>语言和输入法==>文字转语音(TTS)输出==>首选引擎
3.在代码中使用: 继续阅读Android使用讯飞语记引擎实现中文TTS
android 8种对话框(Dialog)使用方法汇总
Android属性动画完全解析
Android干货框架集锦,搭建项目必不可少
VLC全部详细参数
节选自:VLC全部详细参数,libvlc_new函数参数,VLC SDK开发
打开系统命令提示符窗口(“运行”中输入“cmd”),切换到vlc.exe所在目录(安装目录),输入:
vlc -H
在安装目录下会生成”vlc-help.txt”文件
Android adb shell input 命令详解
Android使用VLC播放摄像头RTSP流
1.修改项目build.gradle,增加maven库地址
allprojects {
repositories {
google()
jcenter()
maven { url "https://dl.bintray.com/videolan/Android" }
}
}
2.修改模块build.gradle,增加依赖
// VLC 最新版本 implementation 'org.videolan.android:libvlc-all:3.2.1'
3.布局文件中加入VLCVideoLayout
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <org.videolan.libvlc.util.VLCVideoLayout android:id="@+id/video_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
雄迈摄像头RTSP地址格式
地址:
rtsp://$(IP):$(PORT)/user=$(USER)&password=$(PWD)&channel=$(Channel)&stream=$(Stream).sdp?real_stream
示例:
rtsp://10.6.10.25:554/user=admin&password=&channel=1&stream=0.sdp?real_stream channel 通道 stream 码流 (0主码 1次码)
参考链接:
多线程下java.util.ConcurrentModificationException问题解决
多线程同时增加和获取数据的情况:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { new Main().test(); } private List<String> mData = new ArrayList<>(); private List<String> mCloneData; private int count = 0; public void test() { new Thread(new Runnable() { @Override public void run() { while (true) { mData.add(count++ + ""); mCloneData = null; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { for (String string : getData()) { System.out.println(string); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } private List<String> getData() { if (mCloneData == null) { mCloneData = new ArrayList<>(mData); } return mCloneData; } }