我們目前用 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 一併修正。
system
2
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!
感謝您的分享!
如需查閱技術文件、SDK 資源、常見問題及社群指南,請參考: 這裡
若您是商業用戶,希望獲得專屬技術支援或與我們聯繫,請填寫 Private User Form (商業用戶表單)
祝您使用 Ameba 開發順利!
Pammy
3
您好 @Arrow_rick.lee,
- 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”。
- 是否可自行擴充?— 建議方案:改用 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 不碰影像就搜到.
可以試試看。