You are on page 1of 30

A.

Tổng quan
 Đây là dự án xây dựng web giúp tạo và quản lý luồng stream. Stream
chạy bằng RTSP đang là xu thế ngày nay, được ứng dụng rất nhiều trong
các nền tảng stream như Youtube, Nimo,... .Web cho phép người dùng
thực hiện các tác vụ như thêm stream, xóa stream,... .Ngoài việc tiếp thu
các kiến thức về RTSP, WebRTC hay HLC, việc xây dựng API cho người
dùng là điều cần thực hiện để dự án trở nên hoàn thiện hơn.

 Trong phần này, bọn em sẽ giới thiệu về lý thuyết liên quan (mục B) và
thực hiện viết, giải thích về các API cho người dùng (mục C).
 Về tổng quát, quy trình người dùng sử dụng API như sau:
 Người có quyền cao nhất (ta gọi là super user) sẽ tạo group (tên
công ty) và các role (vai trò) dưới mình.
 Super user tạo tài khoản cho người dùng bao gồm username,
password, group và role.
 Super user cũng có thể chỉnh sửa, xóa, liệt kê các tài khoản của
người dùng.
 Người dùng thực hiện đăng nhập vào tài khoản của mình.
 Tùy vào vai trò, người dùng có thể thực hiện các tác vụ với stream
và đưa lên web RTC
B. Lý thuyết
 RTSP (real time streaming protocol): là giao thức truyền phát thời gian thực.
Bằng cách giao tiếp trực tiếp với máy chủ truyền dữ liệu, RTSP giúp truyền
dữ liệu thời gian thực từ đa phương tiện sang thiết bị đầu cuối.
 RTMP: Real Time Messaging Protocol, dựa trên giao thức điều khiển TCP.
RTMP an toàn, có thể truyền phát âm thanh, video và văn bản trong bất kì
trình duyệt web nào tương thích với Flash
 RTSP: Real Time Streaming Protocol, là giao thức phát trực tuyến thời gian
thực. Máy chủ RTSP nằm giữa người phát và người xem, đưa ra các lệnh
“phát”, “ghi”, “tạm dừng”. RTSP sử dụng 2 phương thức TCP và UDP. TCP
phát hành và nhận các lệnh điều khiển của luồng trong khi UDP cung cấp
âm thanh, video và dữ liệu
 WebRTC: cho phép giao tiếp video, âm thanh thời gian thực bên trong trang
web
 HLS: HTTP Live Streaming: là một giao thức truyền phát đa phương tiện để
cung cấp phương tiện hình ảnh và âm thanh cho người xem qua Internet.
 Quy trình hoạt động:
1. Các thiết bị chụp (máy ảnh,...) ghi lại nội dung
2. Nội dung được gửi đến bộ mã hóa video trực tiếp từ thiết bị
chụp
3. Bộ mã hóa truyền nội dung đến nền tảng lưu trữ video thông
qua HTTP
4. Nền tảng lưu trữ video sử dụng HLS để truyền nội dung đến
trình phát video HTML5
 Tổng quan kỹ thuật
1. Giao thức HLS cắt video thành các đoạn ngắn (khoảng 10s)
2. Tiếp theo, một máy chủ HTTP lưu trữ cái luồng đó và HTTP
cung cấp video ngắn này cho người xem trên thiết bị của họ
3. HTTP cũng tạo 1 tệp kê khai đóng vai trò là chỉ mục cho các
đoạn video
 MSE: Media Source Extensions là tiện ích mở rộng nguồn phương tiện cho
phép bạn tạo các luồng để phát lại từ các phân đoạn âm thanh hoặc video.
MSE là cần thiết nếu bạn thực hiện các việc: dịch chuyển thời gian, phát trực
tuyến thích ứng, ghép nối thích ứng và kiểm soát hiệu suất
 Codec: là một công cụ mã hóa xử lý video và lưu trữ nó trong một luồng
byte. Codec sử dụng thuật toán để thu nhỏ kích cỡ file âm thanh hoặc video
một cách hiệu quả sau đó giải nén khi cần thiết.
 On demand: chế độ phát trực tiếp tĩnh-false (chạy bất kì lúc nào) hoặc theo
yêu cầu-true (chỉ chạy khi có người xem)
C. Các bước thực hiện
Tất cả các bước đều yêu cầu xác thực JWT. Đối với các API User, yêu cầu
token của super user (ngoại trừ change password), tức là super user là người
đăng nhập và thao tác trực tiếp.
Tùy vào role của người đang đăng nhập, các API Stream sẽ có các yêu cầu cụ
thể khác nhau. Điều này sẽ được giải thích ở phần B.
I. User
1. Đăng nhập
http://127.0.0.1:8083/login

Kết quả:

2. Thêm Role mới


http://127.0.0.1:8083/role/add

Kết quả:

3. Thêm Group mới


http://127.0.0.1:8083/group/add

Kết quả:

4. Thêm User mới


http://127.0.0.1:8083/user/add

Kết quả:
5. Chỉnh sửa User
http://127.0.0.1:8083/user/edit

6. Thay đổi Password


http://127.0.0.1:8083/change/password

Kết quả:

7. Xóa User
http://127.0.0.1:8083/user/delete

Kết quả:

8. Liệt kê User
http://127.0.0.1:8083/user/list
Kết quả:
II. Stream
1. Thêm Stream
http://127.0.0.1:8083/stream/add

http://localhost:8083/pages/stream/add
Kết quả:

http://localhost:8083/pages/player/webrtc/<uuid>/<channels>
2. Chỉnh sửa Stream
http://127.0.0.1:8083/stream/edit

http://localhost:8083/pages/stream/edit/<uuid>

Kết quả:

http://localhost:8083/pages/player/webrtc/<uuid>/<channels>
3. Xóa stream
http://127.0.0.1:8083/stream/delete

Kết quả:
4. Liệt kê stream
http://127.0.0.1:8083/stream/list
Kết quả:

http://localhost:8083/pages/stream/list
5. Thông tin của stream
http://127.0.0.1:8083/stream/info

Kết quả:

D. Định nghĩa các hàm


I. User
1. Add Group
 Method: Post
 Link: http://127.0.0.1:8083/group/add
 Header:
Key Token
Token ...
{
"name_group": "...",
"id_group":"..."
}
 Example:
{
"name_group": "vnptit",
"id_group":"1234567"}
Group chỉ nhóm, công ty của người dùng.
Chỉ SuperUser mới được Add Group.
Group ID của từng bản ghi trong mongoDB sẽ không được trùng nhau.
2. Add Role
 Method: Post
 Link: http://127.0.0.1:8083/role/add
 Header:
Key Token
Token ...
{
"level_role": "...",
"id_role":"..."
}
 Example:
{
"level_role": "admin",
"id_role":"1"
}
Role chỉ vai trò của người dùng khi thực hiện thao tác với các luồng stream.
Chỉ superUser mới được Add Role.
Id_role càng lớn, người dùng sẽ có quyền càng cao.
Id_role và level_role của từng bản ghi trong mongoDB sẽ không được trùng nhau.
3. Add User
 Method: Post
 Link: http://127.0.0.1:8083/user/add
 Header:
Key Token
Token ...
{
"username": "...",
"password": "...",
"group_id": "...",
"role_level":"..."
}
 Example:
{
"username": "viet",
"password": "viet",
"group_id": "123456",
"role_level":"admin"
}
Chỉ superUser mới được thực hiện việc Add User
Username của người dùng mới không được trùng với Username của các người
dùng đã được thêm vào trước đó
Group_id và role_level phải tồn tại trong cơ sở dữ liệu
Không được thêm User có role_level là Super_User vì Super_User chỉ có 1 trong
hệ thống
4. Edit User
 Method: Post
 Link: http://127.0.0.1:8083/user/edit
 Header:
Key Token
Token ...
{
"username": "...",
"password": "...",
"group_id": "...",
"role_level":"..."
}
 Example:
{
"username": "viet",
"password": "viet123",
"group_id": "123456",
"role_level":"admin"
}
Chỉ superUser mới có quyền chỉnh sửa User.
Thực hiện việc chỉnh sửa User có Username phải tồn tại trong mongoDB.
Chỉnh sửa group_id và role_level phải tồn tại trong hệ thống.
Không được chỉnh sửa username.

5. Delete User
 Method: Get
 Link: http://127.0.0.1:8083/user/delete
 Header:
Key Token
Token ...
{
"username": "...",
}
 Example:
{
"username": "viet",
}
Chỉ superUser mới có quyền xóa User
Thực hiện xóa User theo Username phải tồn tại trong mongoDB
Không thể xóa tài khoản có Role là Super_user
6. List User
 Method: Get
 Link: http://127.0.0.1:8083/user/list
 Header:
Key Token
Token ...
SuperUser thực hiện liệt kê tất cả các user trong hệ thống ra.
II. Stream
1. API Login
 Method: POST
 Link: http://127.0.0.1:8083/login
 Header:
{
“username”: “...”,
“password”: “...”
}
 Response: “token: …”
 Example:
{
“username”: “viet”,
“password”: “viet”
}
“token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgxOT
c1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQkPVEGn1Kg
hbAAJIrHfrTs”

Phương thức này yêu cầu người dùng đăng nhập thông tin “username” và
“password”.
“username” và “password” phải tồn tại trong mongoDB.
Tài khoản có username: “super_user” và password: “super_user” là tài khoản mặc
định của role Super User.
Tùy vào role mà người dùng đang đăng nhập, API sẽ trả về các token tương ứng để
thực hiện các quyền bên dưới.
2. API Change Password
 Method: POST
 Link: http://127.0.0.1:8083/change/password
 Header:
Key Token
Token ...

{
“old_password”: “...”,
“new_password”: “...”
}
 Example:
{
“old_password”: “viet”,
“new_password”: “viet123”
}
Người dùng đang login tiến hành thay đổi mật khẩu của tài khoản mình.
Old password phải thuộc về user đang đăng nhập và tồn tại trong database.
Sau khi thay đổi mật khẩu thành công, token người đó đang đăng nhập sẽ hết hạn
và yêu cầu việc đăng nhập lại với mật khẩu mới đổi.

3. API List Stream


 Method: GET
 Link: http://127.0.0.1:8083/streams
 Header:
Key Token
Token ...

 Response:
{
"status": 1,
"payload": {
"...": {
"channels": {
"0": {
"audio": ...,
"url": "..."
}
},
"name": "..."
},
"...": {
"channels": {
"0": {
"on_demand": ...,
"url": "..."
}
},
"name": "..."
}
}
}

 Example:
Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs

{
"status": 1,
"payload": {
"27aec28e-6181-4753-9acd-0456a75f0289": {
"channels": {
"0": {
"audio": true,
"url": "rtmp://
171.25.232.10/12d525bc9f014e209c1280bc0d46a87e"
}
},
"name": "111111111"
},
"f5aa857c-13e2-4c57-9cf1-c8837ff7a983": {
"channels": {
"0": {
"on_demand": true,
"url": "rtsp://admin:Abc123789_@222.253.220.109:1554/
profile2/media.smp"
}
},
"name": "viet"
}
}
}
Đây là phương thức liệt kê danh sách các Stream hiện có trong Database. Tuy
nhiên như đã đề cập ở trên, phương thức này sẽ cần người dùng nhập token đã lấy
ở phương thức Login bên trên.
Nếu người dùng đang là role super_user, việc thực hiện liệt kê stream sẽ in ra tất cả
các user đang có, tuy nhiên nếu đang là các role khác, người dùng chỉ in ra được
các user có cùng group_id.
Việc thực hiện liệt kê stream sẽ không in ra thông tin về channel của người dùng
đó.
4. API Add a Stream
 Method: POST
 Link: http://127.0.0.1:8083/stream/add
 Header:

Key Token
Token ...

curl \
--header "Content-Type: application/json" \
--request POST \
--data '{
“uuid”: “...”,
"name": "...",
"channels": {
"0": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
},
"1": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
}
}
}' \

 Response:

{
"status": ...,
"payload": "..."
}
 Example:
Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs
curl \
--header "Content-Type: application/json" \
--request POST \
--data '{
“uuid”: “10”,
"name": "test video",
"channels": {
"0": {
"name": "ch1",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
},
"1": {
"name": "ch2",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
}
}
}' \
{
"status": 1,
"payload": "success"
}
Phương thức thêm người dùng vào database. Các thông số cơ bản do người dùng
tự nhập. Phương thức này sử dụng token đã tạo được ở trên và trả về “success” nếu
quá trình thành công.
Việc add stream sẽ thực hiện gán role_level và group_id của người đang đăng nhập
vào từng stream họ tạo.
Việc thực hiện thêm stream sẽ không cho phép trường “uuid” được trùng nhau.
5. API Update a Stream
 Method: POST
 Link: http://127.0.0.1:8083/stream/edit
 Header:
Key Token
Token ...

curl \
--header "Content-Type: application/json" \
--request POST \
--data '{
“username”: “...”,
“group_id”:”...”,
“role_level”:”...”,
“uuid”:”...”,
"name": "...",
"channels": {
"0": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
},
"1": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
}
}
}' \

 Response:
{
"status": ...,
"payload": "..."
}
 Example:
Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs

curl \
--header "Content-Type: application/json" \
--request POST \
--data '{
“username”: “viet”,
“group_id”:”123456”,
“role_level”:”admin”,
“uuid”:”10”,
"name": "test video",
"channels": {
"0": {
"name": "ch1",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
},
"1": {
"name": "ch2",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
}
}
}' \

{
"status": 1,
"payload": "success"
}
Phương thức này cập nhật 1 Stream đã có sẵn trong database. Yêu cầu người dùng
nhập thông tin mới, sau đó sẽ ghi đè lên thông tin cũ và trả về kết quả “success”
nếu thành công. Tương tự như trên, phương thức này yêu cầu token đã lấy ở trên.
Ngoại trừ super_user, tất cả các user phải chung 1 group mới có thể chỉnh sửa.
Chỉ người có role_level cao hơn mới được chỉnh sửa người có role_level thấp hơn
hoặc bằng.
Role_level bằng nhau thì sẽ không cho phép nâng role_level lên.
Các trường username, uuid, group_id và role_level phải tồn tại trong hệ thống.
Không cho phép việc chỉnh sửa Username.
6. API Delete a Stream
 Method: GET
 Link: http://127.0.0.1:8083/stream/delete
 Header:
Key Token
Token ...
{
“username”:”...”
}
 Response:
{
"status": ...,
"payload": "..."
}

 Example:
Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs
{
“username”:”viet”
}
Kết quả:
{
"status": 1,
"payload": "success"
}
Phương thức này xóa 1 Stream đã có. Sau khi nhập token và điền username cần
xóa, kết quả là “success” nếu thành công.
Chỉ người có role cao hơn có thể xóa stream có role thấp hơn hoặc bằng.
Ngoại trừ super_user, tất cả các user phải chung 1 group mới có thể thực hiện
quyền xóa
.
7. API Reload a Stream
 Method: GET
 Link: http://127.0.0.1:8083/stream/{STREAM_ID}/reload
 Header:
Key Token
Token ...

 Response:
{
"status": ...,
"payload": "..."
}
 Example:
Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs

{
"status": 1,
"payload": "success"
}
Phương thức này tải lại 1 Stream đang chạy. Sau khi nhập token và thêm
Stream_ID và link, kết quả là “success” nếu thành công.
8. API Get Stream Info
 Method: GET
 Link: http://127.0.0.1:8083/stream/info
 Header:
Key Token
Token ...

“uuid”:”...”
 Response:
{
"status": 1,
"payload": {
"name": "...",
"channels": {
"0": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
},
"1": {
"name": "...",
"url": "...",
"on_demand": ...,
"debug": ...,
"status": ...
}
}
}
}
 Example:

Key Token
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODgx
OTc1OTAsImlzcyI6InZpZXQifQ.HZkYixVm2bMIsP8H0KPahQ
kPVEGn1KghbAAJIrHfrTs

{
"status": 1,
"payload": {
"name": "test video",
"channels": {
"0": {
"name": "ch1",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
},
"1": {
"name": "ch2",
"url": "rtsp://admin:admin@{YOUR_CAMERA_IP}/uri",
"on_demand": true,
"debug": false,
"status": 0
}
}
}
}
Người dùng nhập token và STREAM_ID, API sẽ trả về thông tin người dùng theo
ID đã được nhập.
Ngoại trừ super_user, tất cả các user phải chung 1 group mới có thể xem thông tin.
Chỉ người có role lớn hơn mới có thể xem được người có role bé hơn.

You might also like