I tried V-Modal's Swift SDK (https://github.com/v-modal/vmodal_sdk_swift_iphoneduo) through its Framebase example. You describe a scene, and it returns matching frames with timestamps from indexed videos.
I haven't tested the alternatives yet. I'm an iOS developer, so the native Swift SDK was a big reason to start here. The API looked convenient, and I liked working with it.
I used the three bundled street videos from San Francisco, Singapore and Mexico City. Uploading, indexing, search and playback worked in my Simulator tests. Searching for "A bus on a city street" returned frames with buses. Tapping the 00:35 result opened that moment in the San Francisco video. The screenshots show the library, two searches and playback.
For device measurements, I ran 21 searches on an iPhone 13 mini over 5G, using the same index and a limit of 30 results. I alternated three queries for seven cycles and cross-checked the HTTP request timings with Instruments.
Median timings in milliseconds, in this order: server execution / SDK search call / frame retrieval:
- "Cars at an intersection": 49 / 391 / 1055
- "A bus on a city street": 56 / 413 / 1151
- "People crossing the street": 56 / 426 / 1053
The search-call time already includes server execution. Frame retrieval comes afterward. I didn't measure final UI rendering. These numbers are from the physical iPhone; the app screenshots are from Simulator.
I was testing from the Canary Islands, and the team confirmed that the server is in Japan. Distance and routing likely account for some of the gap between server execution and the request times on my phone.
I liked the API and authentication approach, especially Swift Concurrency and async/await. One thing I'd change: parameters with a fixed set of accepted values could use dedicated enums instead of strings. I'd rather pick an option through autocomplete than remember its exact spelling, and let the compiler catch invalid values.
I also tried "A purple elephant riding a bicycle." At the default distance cutoff of 0.85, it returned two ordinary street frames. For an actual app, I'd check the results and tune that threshold. A returned frame doesn't necessarily contain what you asked for.