Ghi luồng rtsp bằng ffmpeg

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"
  1. ultrafast
  2. superfast
  3. veryfast
  4. faster
  5. fast
  6. medium – default preset
  7. slow
  8. slower
  9. veryslow
  10. 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.
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

Comments Off on Ghi luồng rtsp bằng ffmpeg

Filed under Software

Comments are closed.