# MP4 錄影檔需要第三個軌（timed metadata / user-data track）

**URL:** <https://forum.amebaiot.com/t/mp4-timed-metadata-user-data-track/5106>\
**Category:** Multimedia\
**Tags:** evb-amb82, rtl8735b\
**Created:** [September 29, 2026, 5:51am UTC](https://forum.amebaiot.com/t/mp4-timed-metadata-user-data-track/5106 "2026-09-29T05:51:26Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arrow\_rick.lee](https://avatars.discourse-cdn.com/v4/letter/a/74df32/32.png) [@Arrow\_rick.lee](https://forum.amebaiot.com/u/Arrow_rick.lee)\
**Post date:** [September 29, 2026, 5:51am UTC](https://forum.amebaiot.com/t/mp4-timed-metadata-user-data-track/5106/1 "2026-09-29T05:51:26Z")

</div>

我們目前用 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 一併修正。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex016/uploads/ameba/original/2X/7/7009caf971627f868f3de3d34312aff2d14c61e3.png) [@system](https://forum.amebaiot.com/u/system)\
**Post date:** [September 29, 2026, 5:51am UTC](https://forum.amebaiot.com/t/mp4-timed-metadata-user-data-track/5106/2 "2026-09-29T05:51:29Z")

</div>

👋 Thanks for posting!

For documentation, SDK resources, FAQs, and community guidelines, please visit: [here](https://forum.amebaiot.com/t/forum-community-guidelines-and-resources/4969)

For commercial users, if you would like to have dedicated technical support or to connect with us, please fill in the [Private User Form](https://forms.cloud.microsoft/r/FK9WxDhvDg)

Happy building with Ameba!

* * *

👋 感謝您的分享！

如需查閱技術文件、SDK 資源、常見問題及社群指南，請參考: [這裡](https://forum.amebaiot.com/t/forum-community-guidelines-and-resources/4969)

若您是商業用戶，希望獲得專屬技術支援或與我們聯繫，請填寫 [Private User Form (商業用戶表單)](https://forms.cloud.microsoft/r/FK9WxDhvDg)

祝您使用 Ameba 開發順利！

---

<div class="post-metadata">

**Author:** ![Pammy](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/pammy/32/936_2.png) [@Pammy](https://forum.amebaiot.com/u/Pammy)\
**Post date:** [October 1, 2026, 9:06am UTC](https://forum.amebaiot.com/t/mp4-timed-metadata-user-data-track/5106/3 "2026-10-01T09:06:56Z")

</div>

您好 @Arrow_rick.lee，

1. mp4\_muxer 是否支援第三個 track？

不支援。 這是 mp4\_muxer 本身的結構限制。  
mp4\_params\_t.record\_type 只接受三個值:

```auto
  #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：

```auto
  // 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 不碰影像就搜到.

可以試試看。
