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à một điểm khởi đầu tốt cho người mới bắt đầu, vì nó có chứa 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: