0244 | ใช้ GPU intel transcode video ด้วย ffmpeg

API ใหม่ๆ ของ ffmpeg จะทำงานบน vaapi (video accelerator api) เพราะงั้นเวลา transcode เลยต้องใช้ interface ของ vaapi ประมาณนี้

ffmpeg \
  -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
  -i inputfile.mp4 \
  -c:v h264_vaapi -b:v 1500k -profile:v main -g 100 \
  -c:a aac -b:a 128k \
  -f mp4 output.mp4
  1. สั่ง ffmpeg
  2. ตั้งค่าให้สัญญาณ video ขาเข้า ไป decode ด้วย vaapi (เพื่อให้เอาผลลัพท์ไปใช้ต่อใน vaapi ได้)
  3. ระบุสัญญาณ input
  4. ระบุการแปลง format ให้ใช้ vaapi h264 encoder ปรับ profile/bitrate ตามชอบ option อื่นๆ ไปดูใน docs
  5. ตั้ง codec เสียง
  6. เก็บ output เป็น format mp4 ลงไฟล์ output.mp4

ref: https://trac.ffmpeg.org/wiki/Hardware/VAAPI

แถม อันนี้ใช้ vlc clean สัญญาณกล้องวงจรปิด ก่อนส่งให้ ffmpeg transcode ต่อ (ไม่รู้ทำไม ffmpeg transcode ตรงๆ ไม่ได้)

vlc \
 'rtsp://192.168.1.102/user=admin&password=&channel=1&stream=0.sdp?' \
  --sout '#duplicate{dst=std{access=file,mux=ts,dst=-}}' | \
  ffmpeg \
    -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
    -i - \
    -c:v h264_vaapi -b:v 1500k -profile:v main -g 100  \
    -y -f flv rtmp://127.0.0.1/live/cctv2