diff --git a/docs/Deploy.md b/docs/Deploy.md
index 5b66967..56b0ee1 100644
--- a/docs/Deploy.md
+++ b/docs/Deploy.md
@@ -412,5 +412,41 @@ firewall-cmd --list-ports
## 证书
```
-keytool -genkeypair -keyalg RSA -dname "CN=localhost, OU=acgist, O=taoyao, L=GZ, ST=GD, C=CN" -alias taoyao -validity 3650 -ext ku:c=dig,keyE -ext eku=serverAuth -ext SAN=dns:localhost,ip:127.0.0.1 -keystore taoyao.jks -keypass 123456 -storepass 123456
+mkdir /data/certs
+cd /data/certs
+vim server.ext
+
+---
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = serverAuth, clientAuth
+subjectAltName=@SubjectAlternativeName
+
+[ SubjectAlternativeName ]
+IP.1=127.0.0.1
+IP.2=192.168.1.100
+IP.3=192.168.1.110
+IP.4=192.168.8.100
+IP.5=192.168.8.110
+DNS.1=localhost
+DNS.2=acgist.com
+DNS.3=www.acgist.com
+DNS.4=taoyao.acgist.com
+---
+
+# CA
+openssl genrsa -out ca.key 2048
+openssl req -x509 -new -key ca.key -out ca.crt -days 3650
+openssl x509 -in ca.crt -subject -issuer -noout
+# subject= /C=cn/ST=gd/L=gz/O=acgist/OU=acgist/CN=acgist.com
+# issuer= /C=cn/ST=gd/L=gz/O=acgist/OU=acgist/CN=acgist.com
+
+# Server
+
+openssl genrsa -out server.key 2048
+openssl req -new -key server.key -out server.csr
+openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -extfile server.ext
+openssl x509 -in server.crt -subject -issuer -noout
+# subject= /C=cn/ST=gd/L=gz/O=acgist/OU=taoyao/CN=taoyao.acgist.com
+# issuer= /C=cn/ST=gd/L=gz/O=acgist/OU=acgist/CN=acgist.com
+openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -name taoyao
```
diff --git a/docs/Learning.md b/docs/Learning.md
index 17c129d..cb9df3c 100644
--- a/docs/Learning.md
+++ b/docs/Learning.md
@@ -26,6 +26,7 @@ https://www.cnblogs.com/ssyfj/p/14843082.html
## 更多资料
+https://zhuanlan.zhihu.com/p/466172240
http://koca.szkingdom.com/forum/t/topic/218
http://www.manoner.com/post/音视频基础/WebRTC核心组件和协议栈/
https://blog.csdn.net/ababab12345/article/details/115585378
diff --git a/docs/certs/ca.crt b/docs/certs/ca.crt
new file mode 100644
index 0000000..3c4b0e1
--- /dev/null
+++ b/docs/certs/ca.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDjzCCAnegAwIBAgIJAKPjuujtbFnoMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
+BAYTAmNuMQswCQYDVQQIDAJnZDELMAkGA1UEBwwCZ3oxDzANBgNVBAoMBmFjZ2lz
+dDEPMA0GA1UECwwGYWNnaXN0MRMwEQYDVQQDDAphY2dpc3QuY29tMB4XDTIzMDIy
+NzEzMzUyNloXDTMzMDIyNDEzMzUyNlowXjELMAkGA1UEBhMCY24xCzAJBgNVBAgM
+AmdkMQswCQYDVQQHDAJnejEPMA0GA1UECgwGYWNnaXN0MQ8wDQYDVQQLDAZhY2dp
+c3QxEzARBgNVBAMMCmFjZ2lzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDbt9orZnoTtzbaI9+S8uqqvi8rqOzi+b3tRHOYE+JVQNxWf8vTvKJ5
+mDDrBqICVy2SCtwkxXgrjDcRQVKK1IiDqxQ4oY6DCZetx4gQhYk9ychYsPPKnRg8
+bQEG48DM1EhmxhozUv7kaiUMS0LNODfzLTH/C25Nhgt3laGCtcIWOQliO9AVOxam
+EasfYP01AfL2qahk1s5N7fK9poLpbR9BS8ZUYMxZ5xOIUcc5eithBgGvuHUv9nEY
+Dart6XPC4z3YE9liwrxYwcBxztdvCA2EWeh1k0wNcrT/eJG3cuGgzsPDjI/BORq1
+DWFKJOXrWmhmIlw+VaQ6PIiD4/aQ50xfAgMBAAGjUDBOMB0GA1UdDgQWBBR98tbO
+eDI9mBcuZ96keDld1w54OzAfBgNVHSMEGDAWgBR98tbOeDI9mBcuZ96keDld1w54
+OzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCavKK+pJCmWDqFNMoX
+YwdRPDJS7LoCFV7C8oTkX5myCKNOi11bzlyqP/EkelubtRgaNr+GZCyhwxPiJvRx
+ZrWsoWpOH8OEdADM9lU+UXR23Ufmo9jFFEL7jZ9u9OmOJWAM5xM1KqCBd5+KRvfE
+oEHXdayfy6l00F+rsgaMm6IKdZcthAxVVEKO60GfwavcuvIiHVVLxW21H8BMoqd6
+Erigq7wJRRH+qm7Q5fVpmo1L7E6T2cBvGcFHKuQFdoxDlH4N6tPRDuRSODKFE//O
+D1ViQY65nn35mawbz2AgUUPvWiBDYYomeKIiGl859PukeP1jwDZcECFtrhH4s1p+
+at2z
+-----END CERTIFICATE-----
diff --git a/docs/certs/ca.key b/docs/certs/ca.key
new file mode 100644
index 0000000..ebb4f08
--- /dev/null
+++ b/docs/certs/ca.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEA27faK2Z6E7c22iPfkvLqqr4vK6js4vm97URzmBPiVUDcVn/L
+07yieZgw6waiAlctkgrcJMV4K4w3EUFSitSIg6sUOKGOgwmXrceIEIWJPcnIWLDz
+yp0YPG0BBuPAzNRIZsYaM1L+5GolDEtCzTg38y0x/wtuTYYLd5WhgrXCFjkJYjvQ
+FTsWphGrH2D9NQHy9qmoZNbOTe3yvaaC6W0fQUvGVGDMWecTiFHHOXorYQYBr7h1
+L/ZxGA2q7elzwuM92BPZYsK8WMHAcc7XbwgNhFnodZNMDXK0/3iRt3LhoM7Dw4yP
+wTkatQ1hSiTl61poZiJcPlWkOjyIg+P2kOdMXwIDAQABAoIBAQC7SeS2yguVcr9X
+Au05Hcfa83LSDJSghbHX5lmCcLClazxmn1jnjAwTCh/otyaySA2YR5mP3qOou0TV
+eJEbtj8HvXTnMQ+Bs1OP1l2td6ac/LvCnlOximd2WpRdgxZ9gxaURJlg1oZfvfsG
+l8DBngJTT1smxF+pxXFQ5kNeYACpXzDEN38paW2M4YFbEvFwp0lB1GbuozJ23RPw
+lb1muYHPk8vqJHjnrJJAuX01HMB+RwOyVvLd+mdtmARga1yRFHxyoEml1APH8Kxq
+KK11JsEGNOs+L8nC2NozoFxdR8OLi1p0c/n96XZevz3bSVrPddpc3YQ5Cn4ILR91
+d2d6EizBAoGBAO1aSji+KoF8hDgdNtG1QWDAd4L/E6vuzvTpmLqWnFZ3NAvhPrx7
+O5dQwXWhRnYzJu7iikeJowUPwlYz+SmnKCAhfR5bWvQPpb5/N0fna8T64QdBWa3k
+YV6RUEe3jKqgZvadTSI3XrAV4m5bH6SbJXpaZKdPnxt7+yG5R1Iwg+GVAoGBAOz6
+5DHSt8JV8+L8NL59sieidwcQvKPrkcM4Dk4Tulh+U5Qvh4Yw1mfiBIq3y1irxAJM
+ToaQvs/4BQHVw97t7+sgOPhe2e+H42up1ZeIGrvPuRoo/jplLcy2jM/k+Ll/ZwEG
+XEAIwYEhXCmxXHqlgzpvDgZcqeP6lYn5P8uPTmEjAoGBAJQ3ZtPqRKbZd8OG0r2/
+31Sou7jMyp76ILilyt7xwCzqgVDN1pxipALIxhZLoLGdHbndM5aap3c4sRWdnQFa
+xd7SqswzJif0QX8k+ANpy02VkMI0F+lUDU29lpFCWJAQXFuyPQGZ7AIvmFdrheYH
+kC7IlcQ5H1VNZbRYe+YiL6jFAoGAdReqtSuG/JD3xsoTTaRR6N+PrIAKlXwKM8l4
+1/9LbfpNVcT+U8HBzuaQk/IomZGVcgU+L6NJhPzpjHSRKY+roiPzwlUrnf0o08PA
+8/SeMPp8XX6vzy67KJFyli5u70kSHiGEZ2dsJV/UaA1ownkRlEfXSDF1CF6CkQAF
+E5Glir0CgYEAxhcwMb1gbmdE9iFdS0J7mef7A6PBrQjNzRbqEb9+kFbUzr12LJ0j
+5RJ9VXUBLwXDJ5lR1rtkdG9sgOoC5YQKVqiwpZbe9AO7a7+wSrteQKKMGBafBtVh
+2VTpqC6pnVGfhKiM5nP/a89eoe9QazZSiEvJV5Q7K/yrp/lklJq4E2I=
+-----END RSA PRIVATE KEY-----
diff --git a/docs/certs/ca.srl b/docs/certs/ca.srl
new file mode 100644
index 0000000..d9e8f10
--- /dev/null
+++ b/docs/certs/ca.srl
@@ -0,0 +1 @@
+C75F31B213340862
diff --git a/docs/certs/server.crt b/docs/certs/server.crt
new file mode 100644
index 0000000..1efc4dc
--- /dev/null
+++ b/docs/certs/server.crt
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID2TCCAsGgAwIBAgIJAMdfMbITNAhiMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
+BAYTAmNuMQswCQYDVQQIDAJnZDELMAkGA1UEBwwCZ3oxDzANBgNVBAoMBmFjZ2lz
+dDEPMA0GA1UECwwGYWNnaXN0MRMwEQYDVQQDDAphY2dpc3QuY29tMB4XDTIzMDIy
+NzEzMzg0OFoXDTMzMDIyNDEzMzg0OFowZTELMAkGA1UEBhMCY24xCzAJBgNVBAgM
+AmdkMQswCQYDVQQHDAJnejEPMA0GA1UECgwGYWNnaXN0MQ8wDQYDVQQLDAZ0YW95
+YW8xGjAYBgNVBAMMEXRhb3lhby5hY2dpc3QuY29tMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAmeQvh6OwHR87DKvm04z1xjbHgh6fxi6y+5jMJ7K7LvPT
+l+7haNB/eeSgEnHL38Naaw2cQvNkSAVPK210q574tQZW6Am2icRb9EJnMx2tKdaG
+8QtTGxddScebyO++7qzf8CwECPRpsZRRp1a5ompCouDXY4VWJatXBMnZX05ZqUJH
+0u6nioDwvd+YBOui4nGCxoF8tcVsidvHWx0JTfC7simyMp/5VvVYt7V4ENuU+3NT
+wDF7sEW1z8Sx1ErE4NLQIyy+PpGmV+h2HgNb0Bnre+jq7v/1Ue2Irsd6xe9iHf3P
+ji/mnkrRdAxd36KszFvmQjLAClJM1tRjc7gGyO8yCQIDAQABo4GSMIGPMAsGA1Ud
+DwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwYQYDVR0RBFow
+WIcEfwAAAYcEwKgBZIcEwKgBbocEwKgIZIcEwKgIboIJbG9jYWxob3N0ggphY2dp
+c3QuY29tgg53d3cuYWNnaXN0LmNvbYIRdGFveWFvLmFjZ2lzdC5jb20wDQYJKoZI
+hvcNAQELBQADggEBAKDYyUUMFDchfTYwEhUWHHtUpJTzVz2opAoKjUU2yH4pT4dT
+Fb1s4NAuopoU9ycX4MJaApmxMioWwQzkoBLbnr+4RPfOYR9nlU0s+dx5JcpOgJtR
+6X08ZDmW2DqhfIqR89uvIOgOU0oc6nUxQ0+doihDYyuyvXkvkZLjl8hrv6phuL8e
+qhtx9++4umD3RYbRsASRmB8/iYTgi7WAvFyNM9kkS5pwkJOaHN+vtKx5xpytEROT
+pbdUgGdXcYzYwzqDJ7Wbe0pIKeZ97rx6mF+0/92sWhd2U54jn5M1gp1sCQqG/syd
+tER+0jG77mvqkls5VCNmUE1+pOa53MvB5TuTTsA=
+-----END CERTIFICATE-----
diff --git a/docs/certs/server.csr b/docs/certs/server.csr
new file mode 100644
index 0000000..115e83b
--- /dev/null
+++ b/docs/certs/server.csr
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICqjCCAZICAQAwZTELMAkGA1UEBhMCY24xCzAJBgNVBAgMAmdkMQswCQYDVQQH
+DAJnejEPMA0GA1UECgwGYWNnaXN0MQ8wDQYDVQQLDAZ0YW95YW8xGjAYBgNVBAMM
+EXRhb3lhby5hY2dpc3QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAmeQvh6OwHR87DKvm04z1xjbHgh6fxi6y+5jMJ7K7LvPTl+7haNB/eeSgEnHL
+38Naaw2cQvNkSAVPK210q574tQZW6Am2icRb9EJnMx2tKdaG8QtTGxddScebyO++
+7qzf8CwECPRpsZRRp1a5ompCouDXY4VWJatXBMnZX05ZqUJH0u6nioDwvd+YBOui
+4nGCxoF8tcVsidvHWx0JTfC7simyMp/5VvVYt7V4ENuU+3NTwDF7sEW1z8Sx1ErE
+4NLQIyy+PpGmV+h2HgNb0Bnre+jq7v/1Ue2Irsd6xe9iHf3Pji/mnkrRdAxd36Ks
+zFvmQjLAClJM1tRjc7gGyO8yCQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAC2M
+KwMJv8TKM7QL6UE3skEoMhXgxwwODuIBiiloySHmRsb+fVEYcF1f+gN9UxSVwaIx
+BP7sb/+xy/N9G+28QVTbVlSc1MneQRPHjlx2MQqRHhfxtJ2/Zf6qFUuR2LimuHth
+HwIgQotnUbe6C2630bNeYV5mOyF/rltw0pSoaPlMG9WsNtzZJ1LYzyNp5ztXPR3W
+O2MkNQ3ZWqsR7dQXdUJbgruniwfxVGKxab6wBg+GZsHjiHujEmljjt3MIwimVDT+
+Z1V/R8C1Rlk98lJY5hSVBXZ09C5hox9NAvYkGfZ+ZqupOLoPOrvux7zETsDPxzV9
+mvAXPwkT0zVn/YvUCvo=
+-----END CERTIFICATE REQUEST-----
diff --git a/docs/certs/server.ext b/docs/certs/server.ext
new file mode 100644
index 0000000..399f686
--- /dev/null
+++ b/docs/certs/server.ext
@@ -0,0 +1,14 @@
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = serverAuth, clientAuth
+subjectAltName=@SubjectAlternativeName
+
+[ SubjectAlternativeName ]
+IP.1=127.0.0.1
+IP.2=192.168.1.100
+IP.3=192.168.1.110
+IP.4=192.168.8.100
+IP.5=192.168.8.110
+DNS.1=localhost
+DNS.2=acgist.com
+DNS.3=www.acgist.com
+DNS.4=taoyao.acgist.com
diff --git a/docs/certs/server.key b/docs/certs/server.key
new file mode 100644
index 0000000..a5522dc
--- /dev/null
+++ b/docs/certs/server.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAmeQvh6OwHR87DKvm04z1xjbHgh6fxi6y+5jMJ7K7LvPTl+7h
+aNB/eeSgEnHL38Naaw2cQvNkSAVPK210q574tQZW6Am2icRb9EJnMx2tKdaG8QtT
+GxddScebyO++7qzf8CwECPRpsZRRp1a5ompCouDXY4VWJatXBMnZX05ZqUJH0u6n
+ioDwvd+YBOui4nGCxoF8tcVsidvHWx0JTfC7simyMp/5VvVYt7V4ENuU+3NTwDF7
+sEW1z8Sx1ErE4NLQIyy+PpGmV+h2HgNb0Bnre+jq7v/1Ue2Irsd6xe9iHf3Pji/m
+nkrRdAxd36KszFvmQjLAClJM1tRjc7gGyO8yCQIDAQABAoIBAFSpGhTO0lZTFhM0
+hrofNB6liEBnRJKsoj6Tosy8IQoFjYRqIIufGGIgiodbH0OsnxOB21Nhvut4MEO9
+5Y9812oPYMQqg8dqxQOtfES8sMTxhi8ZgdDHm8S5EVULv8hiRphEPrwGahcNd5ZN
+ubZGKv6cHyJa+jei+S5jNTifS+g2+hEvKyxRdoWFaRJTPeBPr4ayJevDY8zlllh6
+APqLYuJxMrgp0J/XSlwtFZ7O83opj0dt5sZiHV1drNytZU9PMSy6krkXPVV1Ahgo
+QpIFKmrWjjk5ehyyGyexFmVKWCZenrLN14oOvxgKezV7PQwAhWWlpxMLEwP+e4Nu
+o1aqgAECgYEAyMWFZnB5s0R//QhQm8uZEMbauAJtIWvfjWSR1Gtb9g+ykoYOv5TB
+2nG/yCrbtrDvMPYP9ZTG/dB0+PmtJQPNy+ZyIdOeeVACKAzvBQnfUKV8soSsh79+
+RI/GJXfNJ+GcJv1F5t3pEOY/xmp6aZIdTCBkjzseyJAaRLLQzZXMKAECgYEAxDlT
+aSbjyeZomsaN/WSny0qT61spfYOgJyy/B5SLY6ZFRS7p60IjSeAr5LoD4pmqK4B9
+pM7KHPvWyRGkeCqx8A7rJ1VkpwapZn+Lv9SsUpyW9SWqo/0cQ0U/Hu1dBfULdypH
+uQDS1xIrQqLEeA9yLyB90pEvTHHjHybZvcUxygkCgYEAjCqqGXyI2okGOedmL36S
+3E2YQUMgYWboadQ+o2hYiY8oAnepMENwm0sys1KIliEsvKftOGyoCGdSYsgdA2yG
+bsXyBH+zccpT1xZAgOoFiE4goplRwmwEgWVG1r2u8xrlY6sK9EUVBAFboPCRicbC
+wXUT/5MsyKUiUbftYrokEAECgYEAgF/wzg5/YIu5S+ky4+CCVmHIPGY70r3WfUqs
+/8yTFPKmxwhWSW/PnnlmvhFkkU9vIV7C1JvlZujsMEe2jleAakmYVvdrDksxcLlp
+OGtvAe0oZeHqrbbeUrRvA1DPVyJmCeRDYCnFxqdAXiwW1WVlkqdzKduKUj0AFlVY
+husIE+ECgYEAt3DPoPHcAb5PSyoWm2r1FS7j7a0tMGHSDIkUwSRRaB77g7IP1I1N
+jzJmd5VZm69vwXbaxPtJ0YM5SrIq8HbBfNjJmPRinEZjkeq2vrUw8lzoTTZh35Wg
+wgni/eFijGhBkSXcvDuZ2QNi3jtQtaiMwBohGNCjCtfGss/41RNpmGU=
+-----END RSA PRIVATE KEY-----
diff --git a/docs/certs/server.p12 b/docs/certs/server.p12
new file mode 100644
index 0000000..ae37c90
Binary files /dev/null and b/docs/certs/server.p12 differ
diff --git a/taoyao-signal-server/docs/nginx/nginx.conf b/docs/nginx/nginx.conf
similarity index 92%
rename from taoyao-signal-server/docs/nginx/nginx.conf
rename to docs/nginx/nginx.conf
index eb519cf..88ef679 100644
--- a/taoyao-signal-server/docs/nginx/nginx.conf
+++ b/docs/nginx/nginx.conf
@@ -37,8 +37,8 @@ http {
server {
listen 80 default_server;
listen 443 ssl default_server;
- ssl_certificate /data/ssl/taoyao.acgist.pem;
- ssl_certificate_key /data/ssl/taoyao.acgist.key;
+ ssl_certificate /data/certs/server.crt;
+ ssl_certificate_key /data/certs/server.key;
error_page 497 https://$host:$server_port$request_uri;
return 301 https://taoyao.acgist.com$request_uri;
}
@@ -49,8 +49,8 @@ http {
access_log /var/log/nginx/taoyao.acgist.com.log main buffer=32k flush=10s;
- ssl_certificate /data/ssl/taoyao.acgist.com.pem;
- ssl_certificate_key /data/ssl/taoyao.acgist.com.key;
+ ssl_certificate /data/certs/server.crt;
+ ssl_certificate_key /data/certs/server.key;
ssl_ciphers TLS13-AES-128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-ECDSA-AES128-CBC-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_timeout 30m;
diff --git a/taoyao-client-media/README.md b/taoyao-client-media/README.md
index 6022ec8..e4096a3 100644
--- a/taoyao-client-media/README.md
+++ b/taoyao-client-media/README.md
@@ -31,7 +31,7 @@ make -C worker
```
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HTTPS / WSS | | SCTP | SRTP / SRTCP |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ICE / SDP / SIP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ICE / SDP +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TLS | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ DTLS +-+-+-+-+-+-+-+-+-+
| HTTP / WS | NAT / STUN / TURN | | RTP / RTCP |
@@ -44,18 +44,15 @@ make -C worker
### 协议简介
-* 会话通道:ICE/SIP/SDP
+* 会话通道:ICE/SDP
* 媒体通道:RTP/RTCP/SRTP/SRTCP
-* RTP:实时传输协议(音频视频)
-* RTCP:RTP传输控制协议(监控数据传输质量并给予数据发送方反馈)
-* SCTP:流控制传输协议(自定义的应用数据传输)
-* RTMP:实时消息传送协议
-* RTSP:可以控制媒体(点播)
-
-### ICE/SDP/SIP
-
-ICE信息的描述格式通常采用标准的SDP,其全称为Session Description Protocol,即会话描述协议。
-SDP只是一种信息格式的描述标准,不属于传输协议,但是可以被其他传输协议用来交换必要的信息,例如:SIP、RTSP等等。
+* SDP:会话描述协议(只是信息格式描述标准不是传输协议)
+* ICE:交互式连接建立(使用标准SDP描述)
+* RTP:实时传输协议
+* RTCP:RTP控制协议(监控数据传输质量提供反馈)
+* SCTP:流控制传输协议
+* RTSP:实时流传输协议(依赖RTP协议实时性好适合视频聊天视频监控)
+* RTMP:实时消息传输协议
## 其他常见WebRTC媒体服务
diff --git a/taoyao-client-media/src/Config.js b/taoyao-client-media/src/Config.js
index 783c7c6..94d81b6 100644
--- a/taoyao-client-media/src/Config.js
+++ b/taoyao-client-media/src/Config.js
@@ -117,20 +117,20 @@ module.exports = {
// WebRtcServer:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcServerOptions
webRtcServerOptions: {
listenInfos: [
+ // UDP
{
protocol: "udp",
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
port: 44444,
- // 公网地址
- announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP || "192.168.1.110",
- },
- {
- protocol: "tcp",
- ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- port: 44444,
- // 公网地址
announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP || "192.168.1.110",
},
+ // TCP
+ // {
+ // protocol: "tcp",
+ // ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
+ // port: 44444,
+ // announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP || "192.168.1.110",
+ // },
],
},
// WebRtcTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
@@ -138,7 +138,6 @@ module.exports = {
listenIps: [
{
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- // 公网地址
announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP || "192.168.1.110",
},
],
@@ -151,7 +150,6 @@ module.exports = {
plainTransportOptions: {
listenIp: {
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- // 公网地址
announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP || "192.168.1.110",
},
maxSctpMessageSize: 262144,
diff --git a/taoyao-client-media/src/Server.js b/taoyao-client-media/src/Server.js
index 6966b18..a5cc552 100644
--- a/taoyao-client-media/src/Server.js
+++ b/taoyao-client-media/src/Server.js
@@ -44,7 +44,7 @@ async function buildMediasoupWorkers() {
JSON.stringify(config.mediasoup.webRtcServerOptions)
);
for (const listenInfo of webRtcServerOptions.listenInfos) {
- listenInfo.port = listenInfo.port + mediasoupWorkers.length - 1;
+ listenInfo.port = listenInfo.port + mediasoupWorkers.length;
}
const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions);
worker.appData.webRtcServer = webRtcServer;
diff --git a/taoyao-client-media/src/Signal.js b/taoyao-client-media/src/Signal.js
index a714a25..de0afb7 100644
--- a/taoyao-client-media/src/Signal.js
+++ b/taoyao-client-media/src/Signal.js
@@ -9,15 +9,23 @@ const protocol = {
// 当前索引
index: 0,
// 最大索引
- maxIndex: 1000,
+ maxIndex: 999,
+ // 终端索引
+ clientIndex: 99999,
/**
* @returns 索引
*/
buildId() {
- if (++this.index >= this.maxIndex) {
+ if (++this.index > this.maxIndex) {
this.index = 0;
}
- return Date.now() * 1000 + this.index;
+ const date = new Date();
+ return 100000000000000 * date.getDate() +
+ 1000000000000 * date.getHours() +
+ 10000000000 * date.getMinutes() +
+ 100000000 * date.getSeconds() +
+ 1000 * this.clientIndex +
+ this.index;
},
/**
* 生成信令消息
@@ -188,15 +196,15 @@ const signalChannel = {
);
},
/**
- * 推送消息
+ * 异步请求
*
* @param {*} message 消息
*/
- push(message) {
+ push(message) {
try {
this.channel.send(JSON.stringify(message));
} catch (error) {
- console.error("推送消息异常:", message, error);
+ console.error("异步请求异常:", message, error);
}
},
/**
@@ -375,6 +383,9 @@ class Signal {
case "client::shutdown":
this.clientShutdown(message, body);
break;
+ case "client::register":
+ protocol.clientIndex = body.index;
+ break;
case "media::ice::restart":
this.mediaIceRestart(message, body);
break;
@@ -400,15 +411,19 @@ class Signal {
}
/**
- * 通知信令
+ * 异步请求
*
* @param {*} message 消息
*/
push(message) {
- signalChannel.push(message);
+ try {
+ signalChannel.channel.send(JSON.stringify(message));
+ } catch (error) {
+ console.error("异步请求异常:", message, error);
+ }
}
- /**
+ /**
* 同步请求
*
* @param {*} message 消息
@@ -416,24 +431,24 @@ class Signal {
* @returns Promise
*/
async request(message) {
- const self = this;
+ const me = this;
return new Promise((resolve, reject) => {
let done = false;
// 注册回调
- self.callbackMapping.set(message.header.id, (response) => {
+ me.callbackMapping.set(message.header.id, (response) => {
resolve(response);
done = true;
});
// 发送消息
try {
- self.channel.send(JSON.stringify(message));
+ signalChannel.channel.send(JSON.stringify(message));
} catch (error) {
- console.error("请求消息异常:", message, error);
+ reject("同步请求异常", error);
}
// 设置超时
setTimeout(() => {
if (!done) {
- self.callbackMapping.delete(message.header.id);
+ me.callbackMapping.delete(message.header.id);
reject("请求超时", message);
}
}, 5000);
diff --git a/taoyao-client-web/src/App.vue b/taoyao-client-web/src/App.vue
index f925729..0795c0a 100644
--- a/taoyao-client-web/src/App.vue
+++ b/taoyao-client-web/src/App.vue
@@ -83,7 +83,7 @@