MP4 錄影檔需要第三個軌(timed metadata / user-data track)

我們目前用 Standard SDK 的 mmfv2 mp4_module(component/media/muxer/mp4_muxer.h,實作在函式庫內)錄 H.264 + G.711(mp4_audio_format = 1)到 SD 卡,這部分已正常運作。

ONVIF Profile G 的 Search / Replay 測試中有兩項(SEARCH-2-1-14、2-1-16)要求錄影包含一個 Metadata track:每幀(或每秒)寫入一小段帶時間戳的自訂資料(例如 motion / tamper 事件標記,XML 或二進位),讓 NVR 可以不解碼影像就依事件搜尋錄影。這相當於 MP4 的 timed-metadata track(handler type ‘meta’ 或 ‘text’,或 ONVIF 建議的 ‘metx’)。

具體想確認:

1. mp4_muxer 庫是否支援在 video + audio 之外寫入第三個 track?若支援,請提供 mp4_params_t 的設定方式、對應的 record_type / codec id,以及每幀塗入資料的 API(例如透過 mm_module 的第三個 input 或 CMD_MP4_xxx)。

2. 若不支援:是否可提供 mp4_muxer 的原始碼(或跟我們簽 NDA),讓我們自行擴充?我們已有 patch rtsp_api.c / h264.c / module_demuxer.c 的經驗。

3. 若以上都不可行:muxer 是否有寫入 hook(cb_fwrite 我們看到了)可以讓我們在檔案尾端附加自訂 box,或 Realtek 建議的替代方法(sidecar 索引檔)?

這題不阻擋我們目前的進度(Profile T 已全數通過、Profile G 的 Replay 25/25、Search 22/26),但剩下的兩項 Search 測試只能靠這個功能解,希望能有明確答案以便決定產品規格是否宣告支援 Metadata recording。

附帶一個對 Realtek 可能有用的發現:module_demuxer.c 的 find_gop_last_frame() 對 video_len 為 0 的檔案(錄影中、未寫 moov)會除以零造成 UsageFault,我們已在本地加上防護,建議 SDK 一併修正。

:waving_hand: Thanks for posting!

For documentation, SDK resources, FAQs, and community guidelines, please visit: here

For commercial users, if you would like to have dedicated technical support or to connect with us, please fill in the Private User Form

Happy building with Ameba!


:waving_hand: 感謝您的分享!

如需查閱技術文件、SDK 資源、常見問題及社群指南,請參考: 這裡

若您是商業用戶,希望獲得專屬技術支援或與我們聯繫,請填寫 Private User Form (商業用戶表單)

祝您使用 Ameba 開發順利!

您好 @Arrow_rick.lee,

  1. mp4_muxer 是否支援第三個 track?

不支援。 這是 mp4_muxer 本身的結構限制。
mp4_params_t.record_type 只接受三個值:

  #define STORAGE_ALL     0   // video + audio
  #define STORAGE_VIDEO   1   // video only
  #define STORAGE_AUDIO   2   // audio only

moov 的組裝函式是按 media type 成對寫死的(trak_box_video/audio、stsd_box_video/audio、mdia_box_、m inf_box_、stbl_box_*),沒有泛型的 add-track 入口;sample table 的記憶體配置(video_buffer_index / audio_buffer_index、moov_box_size 估算)同樣只認這兩種。自行加 #define STORAGE_METADATA 3不會產生第三個 track,mp4_moov_end() 的 switch 會落到 default 印出 “not support type”。

  1. 是否可自行擴充?— 建議方案:改用 fmp4 writer 的第三個 track

建議方案:
改用 fmp4 writer 的第三個 track
SDK 內的 libmov(component/media/3rdparty/fmp4/libmov/,完整原始碼、已在 build 中)本來就不限於兩個 track:

  // include/mov-writer.h
  int mov_writer_add_video   (mov_writer_t*, uint8_t object, int w, int h, ...);
  int mov_writer_add_audio   (mov_writer_t*, uint8_t object, int ch, int bits, int rate, ...);
  int mov_writer_add_subtitle(mov_writer_t*, uint8_t object, const void *extra, size_t);  // ← 第三個track

 // 每個 sample 有獨立 pts/dts,track 由第二參數指定
  int mov_writer_write(mov_writer_t*, int track, const void *data, size_t bytes, int64_t pts, int64_t dts, int flags);

底層 mov_add_track() 是泛型的,mov_writer_write() 只檢查 track < track_count,沒有數量上限。module_fmp4.c 目前只呼叫 add_video/add_audio,但 writer 本身沒有兩軌限制。

udta 與 SEI 我們都有官方支援、容易上手,但它們分別是「整段標籤」與「藏在影像裡」的方式,都無法讓 NVR 不碰影像就搜到.

可以試試看。