Streaming sử dụng FFmpeg với Wowza Streaming Engine (MPEG-TS)

FFmpeg là một tool dạng dòng lệnh được sử dụng để chuyển đổi các tập tin đa phương tiện giữa các định dạng khác nhau. Bài viết này trình bày cách sử dụng FFmpeg làm bộ encode video/video phát live stream với Wowza Streaming Engine ™ .

Lệnh FFmpeg cơ bản

Cấu trúc câu lệnh ffmpeg thường như sau :

ffmpeg [input-options] -i [input-file] [output-options] [output-stream-URI]

[input-options] tùy chọn đầu vào cho file input hoặc source. Thường nếu source là file stream dạng vod (video-on-demand) thì option là -re.
[input-file] là file video theo yêu cầu (VOD) hoặc URL luồng ứng dụng trực tiếp để phát lại stream.
[output-options] là option bất kỳ để áp cho output hoặc luồng chuyển đến. Ví dụ, sử dụng tùy chọn -f để thiết lập định dạng output.

[output-stream-URI] là URI luồng ra (output). Định dạng của URI này phụ thuộc vào bộ container của output.

Để biết thêm thông tin về cách sử dụng FFmpeg, xem tài liệu FFmpeg chính thức .

Thiết lập stream sử dụng FFmpeg

Ví dụ bạn muốn stream video [install-dir]/content/sample.mp4 có trong máy chủ Wowza (dành cho hệ điều hành Windows).

Để cài đặt và thiết lập FFmpeg (Windows):

  1. Tải xuống bản build mới nhất của FFmpeg tại đường link http://ffmpegeg.zeranoe.com/builds// và giải nén nội dung gói trên Wowza media server.
  2. Đặt thư mục sau trong ổ C: C:/usr/local/share/ffmpeg. Copy nội dung của thư mục cài đặt sẵn trong gói FFmpeg vào thư mục mới này.
  3. Mở cửa sổ Command Prompt và nhập lệnh sau để thay đổi thư mục hiện tại vào thư mục bin FFmpeg :

    cd [ffmpeg-install-dir]\bin

  4. Nhập lệnh FFmpeg sau đây để stream sample.mp4 từ [install-dir]/content :
    ffmpeg -re -i "%WMSAPP_HOME%/content/sample.mp4" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000

  5. Tiếp theo làm theo hướng dẫn ở link này Cách xuất bản và phát trực tuyến (MPEG-TS encoder) để thiết lập một ứng dụng live hoặc vod để publish luồng FFmpeg ở trên. Trong quá trình tạo file stream mới, dùng lại luồng udp://127.0.0.1:10000 làm Stream URI.

Các lệnh FFmpeg được sử dụng trong ví dụ trên xuất ra bitrate thấp, độ phức tạp thấp (low complexity), các luồng chất lượng thấp để có thể chạy được trên hầu hết các thiết bị playback và các hệ thống (system). Để tạo ra luồng chất lượng cao hơn, hãy sử dụng câu lệnh sau:

ffmpeg -re -i "%WMSAPP_HOME%/content/sample.mp4" -vcodec libx264 -vb 500000 -g 60 -vprofile main -acodec aac -ab 128000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000

Transcode (chuyển mã) stream với FFmpeg

FFmpeg có thể được sử dụng để transcode giao thức RTSP , RTP , hoặc luồng MPEG-TS. Để transcode một video source, ta sẽ có thay đổi chút về tham số đầu tiên của dòng lệnh (đường dẫn đến file sample.mp4 ) sang source mà bạn mong muốn và xóa option -re đi . Dưới đây là một vài ví dụ sử dụng cho mỗi định dạng:

RTSP / RTP camera

ffmpeg -i "rtsp://[camera-ip-address]/[camera-URI-syntax]" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000

Luồng MPEG-TS

ffmpeg -i "udp://localhost:[port]" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000

Luồng RTP

ffmpeg -i "unicast.sdp" -vcodec libx264 -vb 150000 -g 60 -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -vbsf h264_mp4toannexb -strict experimental -f mpegts udp://127.0.0.1:10000

Streaming các giao thức truyền khác

FFmpeg có thể publish các luồng sử dụng các giao thức gửi đi khác như RTMP và RTSP / RTP (QuickTime ANNOUNCE).

RTMP

Để gửi luồng sử dụng RTMP, hãy thay đổi phần output của URL FFmpeg từ:
-f mpegts udp://127.0.0.1:10000

Thành :

-f flv rtmp://127.0.0.1/live/myStream
URL RTMP phải theo định dạng này: rtmp://[wowza-ip-address]:1935/[application]/[streamName].

RTSP / RTP

Để gửi luồng bằng RTSP / RTP, thay đổi phần output của URL FFmpeg từ:
-f mpegts udp://127.0.0.1:10000

Đến:

-f rtsp rtsp://127.0.0.1:1935/live/myStream.sdp

URL RTSP phải theo định dạng này: rtsp://[wowza-ip-address]:1935/[application]/[streamName].

Trong đó:
[wowza-ip-address] là địa chỉ IP của máy chủ Wowza media của bạn.

[application] là tên của ứng dụng máy chủ Wowza media (như live or vod ).

[streamName] là tên của luồng trong ứng dụng đó.

Một vài câu lệnh ví dụ FFmpeg khác

Re-stream RTSP với xác thực mật khẩu

Ví dụ này sử dụng chứng chỉ bảo mật (security credentials), mã hóa video/audio là H.264/AAC, baseline profile, level 3.0, 24 fps (frame rate), tần suất keyframe là khoảng 2s, luồng 350kbps, 44.1khz, stereo.
ffmpeg -re -i sample.mp4 -c:v libx264 -profile:v baseline -level 3.0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -vb 310k -c:a libvo_aacenc -ab 40k -ar 44100 -ac 2 -f rtsp -muxdelay 0.1 rtsp://username:password@[wowza-ip-address]:1935/live/myStream

Re-stream RTP với SDP

Ví dụ capture các thiết bị phần cứng local và tạo file SDP trong thư mục hiện tại và sử dụng tốc độ keyframe là 15 khung hình / giây và mã color 12bit:
ffmpeg -y -f dshow -s 640x480 -r:v 15 -i video="Integrated Webcam":audio="Microphone (Realtek High Defini" -c:v libx264 -pix_fmt yuv420p -vb 450 -an -map 0:0 -f rtp rtp://127.0.0.1:10000 -flags +global_header -c:a libvo_aacenc -vn -map 0:1 -f rtp rtp://127.0.0.1:10002 > 10000.sdp

Hiển thị thông số encode stream

Ví dụ này cho biết VOD hoặc các thuộc tính encode stream cho các mục đích khắc phục lỗi :

ffprobe -show_streams [stream-name]

Sau đây là output được xuất ra bởi lệnh này khi thực hiện trên file sample.mp4 :

index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Constrained Baseline
codec_type=video
codec_time_base=1/60
codec_tag_string=avc1
codec_tag=0x31637661
width=512
height=288
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=21
timecode=N/A
id=N/A
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/15360
start_pts=0
start_time=0.000000
duration_ts=9747968
duration=634.633333
bit_rate=640158
nb_frames=19039
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:language=und
TAG:handler_name=VideoHandler
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=mp4a
codec_tag=0x6134706d
sample_fmt=fltp
sample_rate=48000
channels=2
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=-1024
start_time=-0.021333
duration_ts=30439936
duration=634.165333
bit_rate=96193
nb_frames=29727
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
TAG:language=und
TAG:handler_name=SoundHandler
[/STREAM]

Liệt kê các thiết bị đang hiển thị

Ví dụ này liệt kê các tên thiết bị phần cứng sẵn có như webcam và micrô để sử dụng làm nguồn FFmpeg:

ffmpeg -list_devices true -f dshow -i dummy

Chuyển đổi các tệp nguồn .ts sang .mp4

Ví dụ này chuyển đổi file .ts (hoặc bất kỳ nguồn tương thích nào của FFmpeg) sang định dạng chứa .mp4 để sử dụng cho re-stream video VOD của Wowza:

ffmpeg -i input.ts -c:v copy -c:a copy output.mp4

Xoá danh sách chỉnh sửa từ file .mp4

Ví dụ này loại bỏ các danh sách chỉnh sửa từ các file .mp4 khi âm thanh và video không đồng bộ. Một số video recorder sử dụng các danh sách sửa đổi để đồng bộ hóa âm thanh và video trong một bộ container MP4 hoặc MOV khi audio và video bắt đầu ở các timecode khác nhau, nhưng Wowza Streaming Engine không sử dụng các danh sách đã chỉnh sửa này. Thay vào đó, các lệnh FFmpeg sau tạo các ra các file âm thanh và video riêng biệt trong file theo định dạng MKV và loại bỏ một số giây quy định trong trường hợp ví dụ này là 4 kể từ đầu tập tin. Sau đó, tệp video và âm thanh được sửa lại để tạo file .mp4, tức là trong 5 giây ngắn hơn. Điều chỉnh số giây bị xóa khỏi file khi cần để đồng bộ hóa âm thanh và video.

ffmpeg -y -ss 4 -i source.mp4 -c:v copy -an source_video.mkv
ffmpeg -y -ss 4 -i source.mp4 -vn -c:a copy source_audio.mkv
ffmpeg -y -i source_video.mkv -i source_audio.mkv -c:v copy -c:a copy source_trim.mp4

Kiểm tra liên kết keyframe (chỉ dành cho Linux)

Ví dụ này kiểm tra file video VOD để căn chỉnh lại keyframe. Đối với ví dụ này, đảm bảo các dấu thời gian (timestamps) PTS hoặc DTS giống hệt nhau cho mỗi I-frame tương ứng cho mỗi file trong luồng đa bitrate của bạn. Để hiểu thêm về việc liên kết khung chính trong streaming dạng adaptive bitrate, xem tại How to do adaptive bitrate streaming .

ffprobe -output_format csv -show_frames [stream-name] |grep I

Tạo các tệp video liên kết keyframe (chỉ dành cho Linux)

Ví dụ này tạo ra các file video keyframe-aligned, multi-bitrate để sử dụng cho adaptive bitrate streaming . Các lệnh sử dụng file video mẫu bigbuckbunny_1500.mp4 mà bạn có thể tải xuống từ trang web Wowza và sử dụng để thử nghiệm.

ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v veryfast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 1 -b:v 286k -s 384x216 bigbuck-350k.mp4
ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v fast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 2 -b:v 286k -s 384x216 bigbuck-350k.mp4
ffmpeg -y -i bigbuckbunny_1500.mp4 -c:a libfaac -ac 2 -ab 64k -c:v libx264 -preset:v fast -threads 0 -r 24 -g 48 -keyint_min 48 -sc_threshold 0 -x264opts no-mbtree:bframes=1 -pass 2 -b:v 836k -s 640x360 bigbuck-900k.mp4

Lược dịch tại How to use FFmpeg with Wowza Streaming Engine (MPEG-TS)

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quang Nguyễn

3 bài viết.
10 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
4 0
(Ảnh) File source : check.mp4 (gồm luồng audio và subtitle) ffprobe check.mp4 Stream 0:0(und): Video: hevc (Main 10) (hev1 / 0x31766568), yuv...
Quang Nguyễn viết 5 tháng trước
4 0
White
3 7
1. Vài câu lệnh encode với FFMPEG Thường câu lệnh FFMPEG có định dạng : ffmpeg i i: input file Chuyển đổi MPEG sang 3GP ffmpeg i movie1.mpeg a...
Quang Nguyễn viết 5 tháng trước
3 7
Bài viết liên quan
White
25 5
Xin chào mọi người :D Trong bài viết này mình sẽ trình bày một cách cơ bản để ứng dụng kỹ thuật Http Live Streaming (HLS) để play video trên web, ...
Nguyễn Thế Huy viết 5 tháng trước
25 5
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
10 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!