Nếu kiểu nén audio đầu phát không tương thích với kiểu nén audio đầu thu (ffmpeg), có thể tạo ra clip lỗi (0 byte đến vài trăm byte). Các encoding cổ điển làm tốn băng thông nhưng dễ tương thích và khi ghi file thì ffmpeg có thể nén theo kiểu khác hiệu quả hơn, dẫn đến video clip có kích thước nhỏ hơn clip cùng thời gian do camera tự tạo.
Danh sách các container và các kiểu nén audio phù hợp, trong đó mkv chấp nhận nhiều định dạng audio nhất:
Container Audio formats supported
MKV/MKA Opus, Vorbis, MP2, MP3, LC-AAC, HE-AAC, WMAv1, WMAv2, AC3, E-AC3, TrueHD
MP4/M4A Opus, MP2, MP3, LC-AAC, HE-AAC, AC3, E-AC3, TrueHD
FLV/F4V MP3, LC-AAC, HE-AAC
3GP/3G2 LC-AAC, HE-AAC
MPG MP2, MP3
PS/TS MP2, MP3, LC-AAC, HE-AAC, AC3, TrueHD
M2TS AC3, E-AC3, TrueHD
VOB MP2, AC3
RMVB Vorbis, HE-AAC
WebM Vorbis, Opus
OGG Vorbis, Opus
Thí dụ về dòng lệnh Nodejs thu rtsp stream bẳng ffmpeg, nén audio kiểu aac
let clip = [
'-rtsp_transport', 'tcp',
'-i', rtsp_stream,
'-c:a', 'aac',
'-b:a', '128k',
'-c:v', 'copy',
'-map', 0,
filename.mkv
]
return childProcess.spawn('ffmpeg', clip, {detached: false, stdio: 'ignore'})
Thu video clip với cài đặt audio encoding G.711 đầu phát
let clip = [
'-rtsp_transport', 'tcp',
'-i', rtsp_stream,
'-filter:a', 'asetrate=8000',
'-acodec', 'libmp3lame',
'-ar', 44100,
'-c:v', 'copy',
'-map', 0,
filename.mkv
]
Tương thích với nhiều camera, tốc độ nén nhanh
let clip = [
'-hide_banner',
'-y',
'-rtsp_transport', 'tcp',
'-i', rtsp_stream,
'-c:v', 'copy',
'-c:a', 'mp2',
filename.mkv
]
Trường hợp không cần thu audio, như khi camera tự động xoay theo chuyển động, thu audio sẽ ồn với tiếng motor, thay '
-c:a
', '
mp2
'
bằng '-an'
Có thể dùng các option được cài đặt sẵn qua -preset
, tốc độ càng chậm chất lượng càng cao. Khi dùng -preset
có thể không cằn khai báo codec cho video c:v
hay audio c:a
Thực nghiệm: Kết quả tốc độ nén khi dùng preset (phụ thuộc vào máy tính)
ffmpeg -y -threads 1 -i "input_stream" -c:v libx264 -preset ultrafast -c:a aac -max_muxing_queue_size 1024 "output.mp4"
ultrafast
superfast
veryfast
faster
fast
medium
– default presetslow
slower
veryslow
placebo
– ignore this as it is not useful
- 2.16x
- 2.09x
- 2.08x
- 2.08x
- 1.72x
- 1.42x
- 0.886x
- 0.465x
- 0.221x
- ?
let clip = [
'-hide_banner',
'-y',
'-rtsp_transport', 'tcp',
'-i', rtsp_stream,
'-c:v', 'copy',
'-preset', 'ultrafast',
'-c:a', 'aac',
'-b:a', '128k'
]
Cần chạy thử trên dòng lệnh để biết tốc độ nén có phù hợp hay không với một cài đặt cụ thể. Nén live video thì tốc độ không nên dưới 1.
Thumbnail
Chúng ta gọi thumbnail là ảnh trích ra từ video, phân biệt với snapshot/photo là ảnh chụp. Thumbnail có thể bị mờ do đối tượng chuyển động và tốc độ màn trập chậm.
Vì ffmpeg có thể trả lại nhiều luồng output nên có thể cài đặt để có cả video và thumbnail
# thumbnail mỗi 30 giây
ffmpeg -hide_banner -y -rtsp_transport tcp -i rtsp_stream \
-f image2 -vf fps=1/30 thumbnail_%02d.jpg \
-an -c:v copy -preset superfast video.mkv