Bài giảng - Giáo trình

[Bài giảng][bleft]

Thư viện - Đồ án

[Thư viện][bsummary]

Tin tức

[Tin tức][twocolumns]

Tài liệu

[Tài liệu][bleft]

Tìm hiểu về ffserver - xây dựng hệ thống streaming

Bài viết được dịch từ : https://trac.ffmpeg.org/wiki/ffserver 

Nếu bạn cần phải truyền tải nội dung âm thanh / video của bạn qua internet , bạn sẽ thường cần một máy chủ streaming (truyền) , một trong số đó là ffserver . Nó có thể thu thập nhiều nguồn đầu vào (thường là các ứng dụng ffmpeg) và chuyển mã / thu lại / phát sóng mỗi người sử dụng nhiều luồng đầu ra. Sơ đồ đơn giản được thể hiện trong hình dưới đây:



Các nguồn đầu vào khác nhau – input sources – (các ứng dụng ffmpeg) có thể được sử dụng để "cấp dữ liệu" – feeds – cho máy chủ phát sóng (ffserver) với nội dung đa phương tiện sẽ được phân phối tới một nhóm nhiều khách hàng (client) để xem. Mục đích của hình ảnh cho cái nhìn trực quan về khả năng phân tách các phần của hệ thống phát trực tuyến của bạn thành các phần có thể được triển khai trên khắp thế giới, cho phép bạn phát các sự kiện trực tiếp khác mà không cần thay đổi cấu trúc của một hệ thống truyền phát trực tuyến (streaming media system).
Chúng ta hãy tìm hiểu sâu hơn để hiểu rõ hơn về khả năng của hệ thống ffserver. Xem xét hình ảnh sau:



Các thành phần trên được chú thích từ chữ cái đầu :
  • Nguồn đầu vào – input sources (I)
  • Nguồn cấp dữ liệu – feeds (F)
  • Các luồng – streams (S)
  • Trình phát đa phương tiện – media players (P)
Nguồn đầu vào – Input sources
Đây không phải là một phần trong cấu trúc bên trong của công cụ ffserver, mà là các ứng dụng bên ngoài (thường là ffmpeg), có thể gửi các luồng âm thanh / hình ảnh đến ffserver sẽ được phân phối (broadcast – phân phát) tới tất cả người xem (media player). Vì ffmpeg hầu hết được sử dụng như một nguồn đầu vào, và sẽ được dùng hầu hết trong tài liệu này.
Nguồn đầu vào – input sources sẽ được kết nối với ffserver và tự ràng buộc với một hoặc nhiều nguồn cấp dữ liệu – feeds nếu feeds không bị ràng buộc với một số nguồn đầu vào khác vào lúc đó. Việc ràng buộc một nguồn đầu vào với nhiều nguồn cấp dữ liệu là có thể và chỉ thực hiện được nếu input souces có thể sản xuất luồng đầu vào – stream input khác nhau cho mỗi feeds mà nó bị ràng buộc. Thật phí nếu cứ mỗi input sources lại cấp cho mỗi stream input, vì ffserver đã có cách liên kết một nguồn cấp dữ liệu đơn (single feed) với nhiều luồng đầu ra.

Nguồn cấp dữ liệu – Feeds
Feed là một phần bên trong của hệ thống ffserver có mục đích kết hợp một input source với một hay nhiều output stream. Khả năng liên kết feed với nhiều output stream rất hữu ích khi bạn muốn truyền một input source (ví dụ: webcam với âm thanh) bằng nhiều định dạng đầu ra khác nhau (ví dụ: phát trực tuyến video Full HD và một đoạn video xem trước nhỏ cho điện thoại di động) cùng một lúc. Nói ngắn gọn, mỗi yếu tố của feed đại diện cho mỗi input source của bạn. Nó có thể được coi như là một "input jack" (đầu vào của đầu vào) của ffserver, mà bạn kết nối nguồn âm thanh / video của bạn.

Luồng – stream
Một yếu tố của một stream là một phần bên trong của hệ thống ffserver và đại diện cho một điểm kết nối cho tất cả người xem của bạn, những người muốn nhận được một stream cụ thể. Ví dụ: nếu bạn muốn phát một video HD đầy đủ và một video xem trước nhỏ cho điện thoại di động, bạn sẽ tạo một nguồn cấp dữ liệu – feed (để kết nối đầu vào của bạn) và liên kết nó với 2 luồng stream (sẽ xác định kích thước khung khác nhau , kiểu mã hóa và / hoặc định dạng đầu ra). Mỗi phần tử luồng có thể xử lý cho nhiều khách hàng kết nối, giống như một máy chủ web có thể xử lý nhiều ứng dụng web. Nó có thể được coi là "đầu ra" của ffserver, mà người xem của bạn (các ứng dụng media players) có thể kết nối để xem luồng âm thanh / video của bạn. Sự khác biệt rõ ràng giữa feed và stream (giữa đầu vào / đầu ra) là một stream có thể xử lý nhiều kết nối với người xem, trong khi một feed lại chỉ kết nối đến một input source.

Media players 
Media player không phải nằm trong hệ thống ffserver. Đây chỉ đại diện cho người xem của bạn từ "thế giới bên ngoài" đang kết nối với các yếu tố luồng khác nhau để xem nội dung đa phương tiện của bạn. Một số các ứng dụng media player phổ biến như là: ffplay , VLC , Winamp , Windows Media Player , vv

Run hệ thống ffserver 
Để có thể start thành công ffserver, thì trước tiên bạn sẽ cần một file config. Một khi bạn tạo đúng thì bạn có thể start ffserver đơn giản bằng cách chạy lệnh sau:
ffserver -f /etc/ffserver.conf
Tùy thuộc vào file config của bạn, ffserver của bạn sẽ start được hay không :) Nhưng thường thì sẽ không start được đến khi bạn debug được tất cả issuse có thể xảy ra, bao gồm các lỗi cú pháp, do đó bạn sẽ muốn chạy ffserver ở chế độ debug với "-d", có câu lệnh như sau:
ffserver -d -f /etc/ffserver.conf
Bạn có thể tìm danh sách các options với câu lệnh :
ffserver --help
Khi bạn xây dựng một file config hợp lệ, và bạn muốn chạy ffserver của mình dưới dạng nền (dưới dạng daemon), có thể thực hiện bằng cách sử dụng ký tự dấu và (&) theo lệnh shell hoặc thuận tiện hơn, bạn có thể ghi comment " NoDaemon " chỉ thị bên trong file congfig của bạn (chỉ hoạt động trên Windows).

Kết nối nguồn đầu vào của bạn 
Một khi máy chủ ffserver của bạn được start và run, đây là lúc để kết nối các nguồn đầu vào với nó. Không có nguồn đầu vào, ffserver của bạn sẽ không thể phát sóng bất cứ gì đến với thế giới internet được. Vì vậy, chúng ta hãy xem cách làm thế nào để có thể kết nối các nguồn đầu vào đến ffserver. Cách đơn giản nhất là sử dụng công cụ ffmpeg và cú pháp chung cho lệnh này là:
ffmpeg <input> <feed URL>
Tất nhiên, nếu bạn muốn sử dụng một nguồn đầu vào (ffmpeg) và liên kết nó với nhiều feed (nếu bạn muốn chỉ có một ứng dụng bắt đầu), bạn có thể sử dụng:
ffmpeg <inputs> <feed URL> <more inputs> <another feed URL> <even more inputs> <yet another feed URL>
nhưng lưu ý rằng, nếu nguồn đầu vào bị treo, tất cả nguồn cấp dữ liệu bị ràng buộc của nó sẽ là vô dụng. Vì vậy, đó là cách tốt để sử dụng một input source (ffmpeg) kết nối đến mỗi feed (1-1).
Tham số " <feed URL> " có dạng sau:
http://<ffserver_ip_address_or_host_name>:<ffserver_port>/<feed_name>
Tất cả được định nghĩa trong file config ffserver của bạn:
  • <ffserver_ip_address_or_host_name> - sử dụng cho " BindAddress "
  • <ffserver_port> - sử dụng cho " Port "
  • <feed_name> - sử dụng cho " <Feed> "
Giả sử chúng ta muốn stream webcam với video + audio đến với bạn bè. Chúng ta sẽ chỉ đơn giản chạy một dòng lệnh ffmpeg mà sẽ capture input video và audio chuyển tiếp nó để ffserver. Dòng lệnh sẽ giống như sau:
ffmpeg \
    -f v4l2 -s 320x240 -r 25 -i /dev/video0 \
    -f alsa -ac 1 -i hw:0 \
    http://localhost:8090/feed1.ffm
Đây là câu lệnh tương tự :
ffmpeg -f v4l2 -s 320x240 -r 25 -i /dev/video0 -f alsa -ac 1 -i hw:0 http://localhost:8090/feed1.ffm
nhưng viết từng dòng thì sẽ nhìn rõ ràng và dễ hiểu hơn đúng không ^^
  • Phần đầu tiên " -f v4l2 -s 320x240 -r 25 -i / dev / video0 " đại diện cho input đầu tiên của ffmpeg và capture video webcam. 
  • Phần thứ hai " -f alsa -ac 1 -i hw: 0 " đại diện cho input thứ hai của ffmpeg và capture về audio, tùy thuộc vào cấu hình hệ thống audio của chúng ta. 
  • Phần cuối cùng, nhưng không kém phần quan trọng nhất, " http: // localhost: 8090 / feed1.ffm " đại diện cho URL nguồn cấp dữ liệu, cho biết ffmpeg đang kết nối đến với ffserver và gửi luồng stream bao gồm audio + video cho broadcast. Trong ví dụ này, chúng ta sử dụng tên máy chủ "localhost", có nghĩa là mọi thứ đang chạy trên máy tính của chúng ta (mạng local), nhưng nếu bạn cần nguồn cấp dữ liệu trực tuyến ffserver, bạn sẽ cần thay đổi "localhost" thành tên máy chủ hoặc địa chỉ IP máy tính ffserver của bạn. Cũng đảm bảo rằng tên nguồn cấp dữ liệu (feed) của bạn kết thúc bằng " .ffm " và nếu như không phải như vậy, thì bạn thêm " -f ffm " trước URL nguồn cấp dữ liệu của bạn, để xác định định dạng đầu ra theo cách thủ công (vì ffmpeg sẽ không thể biết được một cách tự động), như thế này " -f ffm http://localhost:8090/blah.bleh".
Ngay khi bạn gõ lệnh trên, bạn sẽ thấy ffmpeg hiển thị một số thống kê về các luồng đầu vào của bạn và đếm các khung đầu ra (output frames), đây là dấu hiệu tốt cho thấy mọi thứ hoạt động được (tạm thời như vậy 😊).
Đối với ví dụ này, bạn cần ít nhất những điều sau đây được định nghĩa trong file config của bạn (dấu ba chấm "..." đại diện cho dữ liệu khác không liên quan đến chủ đề này):
Port 8090
BindAddress 0.0.0.0
...
<Feed feed1.ffm>
    ...
</ Feed>
...

Xem luồng stream của bạn 
Nếu bạn đã thực hiện tất cả các bước cho đến đây mà không có lỗi, thì bây giờ bạn đã có thể sẵn sàng để xem các luồng của mình. Cách đơn giản nhất để làm được điều này là sử dụng ffplay để kết nối với ffserver và xem một luồng cụ thể. Cú pháp chung cho lệnh này là:
ffplay <stream URL>
Tham số " <stream URL> " có dạng sau:
http://<ffserver_ip_address_or_host_name>:<ffserver_port>/<stream_name>
Tất cả được định nghĩa trong file config ffserver của bạn:
  • <ffserver_ip_address_or_host_name> - sử dụngchỉ thị " BindAddress "
  • <ffserver_port> - sử dụngchỉ thị " Port "
  • <stream_name> - sử dụng khối " <Stream> "
Ví dụ nếu bạn có luồng stream thích hợp được định nghĩa trong file config ffserver của bạn, bạn có thể nhập:
ffplay http://localhost:8090/test1.mpg
và luồng của bạn sẽ xuất hiện (phụ thuộc vào mã hoá được sử dụng và bộ nhớ đệm được thực thi) tương đối ngắn chỉ trong vài giây. Trong ví dụ này chúng ta đã sử dụng tên máy chủ "localhost" có nghĩa là mọi thứ đang chạy trên máy tính của chúng ta, nhưng nếu bạn cần xem các luồng từ ffserver trực tuyến, bạn cần phải thay đổi "localhost" thành tên máy chủ thực Địa chỉ IP của máy tính ffserver.
Đối với ví dụ này, bạn cần ít nhất những điều sau đây được định nghĩa trong file config của bạn (dấu ba chấm "..." đại diện cho dữ liệu khác không liên quan đến chủ đề này):
Port 8090
BindAddress 0.0.0.0
...
<Stream test1.mpg>
    ...
</Stream>
...

Tạo file config 
Sẽ rất là hay để bắt đầu đọc của ffserver file config mẫu. Đó là tài-liệu-tự-tạo với rất nhiều comment ​​và nó là mt đim khi đầu tt cho người mi bt đầu, vì nó có cha các ví d khác nhau. Ngoài ra, trang tài liệu chính thức ffserver cũng rất có ích. Nói chung, file config bao gồm các chỉ thị global, danh sách các yếu tố nguồn cấp dữ liệu (feed), danh sách các phần tử luồng (stream) và đặc tả chi tiết của một phần tử luồng trạng thái đặc biệt được sử dụng để cung cấp cho bạn xem trạng thái của tất cả các luồng đang chạy.

Ví dụ về tập tin cấu hình 
Phát trực tuyến video H.264 với âm thanh AAC ở định dạng FLV 

Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
#NoDaemon

<Feed feed1.ffm>
 File /tmp/feed1.ffm
 FileMaxSize 200K
 ACL allow 127.0.0.1
</Feed>

# if you want to use mpegts format instead of flv
# then change "live.flv" to "live.ts"
# and also change "Format flv" to "Format mpegts"
<Stream live.flv>
 Format flv
 Feed feed1.ffm

 VideoCodec libx264
 VideoFrameRate 30
 VideoBitRate 512
 VideoSize 320x240
 AVOptionVideo crf 23
 AVOptionVideo preset medium
 # for more info on crf/preset options, type: x264 --help
 AVOptionVideo flags +global_header

 AudioCodec aac
 Strict -2
 AudioBitRate 128
 AudioChannels 2
 AudioSampleRate 44100
 AVOptionAudio flags +global_header
</Stream>

##################################################################
# Special streams
##################################################################
<Stream stat.html>
 Format status
 # Only allow local people to get the status
 ACL allow localhost
 ACL allow 192.168.0.0 192.168.255.255
</Stream>

# Redirect index.html to the appropriate site
<Redirect index.html>
 URL http://www.ffmpeg.org/
</Redirect>
##################################################################

Streaming Theora video với Vorbis audio trong format Ogg 

Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 1000
CustomLog -
#NoDaemon

<Feed feed1.ffm>
 File /tmp/feed1.ffm
 FileMaxSize 200K
 ACL allow 127.0.0.1
</Feed>

<Stream live.ogg>
 Format ogg
 Feed feed1.ffm

 VideoCodec libtheora
 VideoFrameRate 24
 VideoBitRate 512
 VideoSize 320x240
 VideoQMin 1
 VideoQMax 31
 VideoGopSize 12
 Preroll 0
 AVOptionVideo flags +global_header

 AudioCodec libvorbis
 AudioBitRate 64
 AudioChannels 2
 AudioSampleRate 44100
 AVOptionAudio flags +global_header
</Stream>

##################################################################
# Special streams
##################################################################
<Stream stat.html>
 Format status
 # Only allow local people to get the status
 ACL allow localhost
 ACL allow 192.168.0.0 192.168.255.255
</Stream>

# Redirect index.html to the appropriate site
<Redirect index.html>
 URL http://www.ffmpeg.org/
</Redirect>
##################################################################


Không có nhận xét nào: