Frigate to HikVision on Docker: Fix HEVC/H.265 Error

Error yang korang nampak

Bila connect Frigate ke camera HikVision, log dia keluar macam ni:

[flv @ 0x5597bab65d40] Video codec hevc not compatible with flv
Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
front: Unable to read frames from ffmpeg process.

Camera HikVision default pakai H.265 (HEVC). Frigate cuba decode guna format flv, tapi flv tak support HEVC. Sebab tu dia crash.

Root cause

Frigate guna ffmpeg internally untuk pull RTSP stream dari camera. Kalau camera output H.265 dan ffmpeg cuba wrap dalam container format yang tak support codec tu, memang fail.

HikVision ada dua stream: main stream (biasanya H.265) dan sub stream (biasanya H.264). Kalau korang pointing ke main stream, tu la punca masalah ni.

Cara fix

Option 1: Tukar ke sub stream (H.264)

Dalam config Frigate, tukar RTSP URL ke sub stream:

cameras:
  front:
    ffmpeg:
      inputs:
        - path: rtsp://admin:[email protected]:554/Streaming/Channels/102
          roles:
            - detect
            - rtmp

Channel 101 = main stream, 102 = sub stream. Sub stream default H.264, terus works.

Option 2: Force H.264 transcode dalam ffmpeg

Kalau korang nak tetap guna main stream, boleh tambah input args untuk transcode:

cameras:
  front:
    ffmpeg:
      input_args:
        - -avoid_negative_ts
        - make_zero
        - -fflags
        - nobuffer
        - -flags
        - low_delay
        - -strict
        - experimental
        - -fflags
        - +genpts+discardcorrupt
        - -use_wallclock_as_timestamps
        - "1"
      inputs:
        - path: rtsp://admin:[email protected]:554/Streaming/Channels/101
          roles:
            - detect

Tapi cara ni CPU intensive. Kalau server korang tak ada hardware decode (Intel QSV, Nvidia NVENC, etc.), transcode realtime boleh makan resource lebih.

Option 3: Set camera output ke H.264 terus

Login HikVision web interface, pergi ke Configuration > Video/Audio > Video. Tukar Video Encoding dari H.265 ke H.264. Lebih senang dari configure ffmpeg.

Recommended approach

Guna sub stream untuk detection, main stream untuk recording kalau korang nak kualiti tinggi:

cameras:
  front:
    ffmpeg:
      inputs:
        - path: rtsp://admin:[email protected]:554/Streaming/Channels/101
          roles:
            - record
        - path: rtsp://admin:[email protected]:554/Streaming/Channels/102
          roles:
            - detect
            - rtmp

Setup ni Frigate detect guna sub stream (lebih ringan), record guna main stream (kualiti penuh). Aku rasa ni paling balanced untuk kebanyakan setup home.

Reference: Frigate GitHub Issue #1602

Leave a Comment