mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-20 06:28:27 +02:00
59 lines
3.3 KiB
Markdown
59 lines
3.3 KiB
Markdown
# iOS FFmpeg capability probe
|
|
|
|
`scripts/ios_ffmpeg_capabilities.m` runs the shipped simulator frameworks without
|
|
building the Flutter app. It checks FLAC, ALAC, 24-bit WAV/AIFF, MP3, Opus and AAC
|
|
encoding/decoding; analysis filters; spectrum PNG/JPEG conversion; and H.264/HEVC
|
|
motion decoding and stream-copy remuxing. This complements application tests: it
|
|
does not prove Flutter routing, download finalization or the Dart TLS proxy.
|
|
|
|
Prepare the audio plugin's XCFrameworks with its provided `scripts/setup_ios.sh`
|
|
from the plugin's `ios` directory. Boot an iOS simulator, then run the following
|
|
from the repository root. Framework copies are signed in a temporary directory;
|
|
the downloaded vendor artifacts remain unchanged.
|
|
|
|
```bash
|
|
probe_plugin="$HOME/.pub-cache/hosted/pub.dev/ffmpeg_kit_flutter_new_audio-2.5.2"
|
|
probe_work=$(mktemp -d /tmp/spotiflac-ios-ffmpeg.XXXXXX)
|
|
mkdir -p "$probe_work/Frameworks"
|
|
for framework in "$probe_plugin"/ios/Frameworks/*.xcframework; do
|
|
name=$(basename "$framework" .xcframework)
|
|
cp -R "$framework/ios-arm64_x86_64-simulator/$name.framework" "$probe_work/Frameworks/"
|
|
codesign --force --sign - "$probe_work/Frameworks/$name.framework"
|
|
done
|
|
xcrun --sdk iphonesimulator clang -fobjc-arc -target arm64-apple-ios16.0-simulator \
|
|
-isysroot "$(xcrun --sdk iphonesimulator --show-sdk-path)" \
|
|
-F "$probe_work/Frameworks" -framework Foundation -framework ffmpegkit \
|
|
-Wl,-rpath,"$probe_work/Frameworks" scripts/ios_ffmpeg_capabilities.m \
|
|
-o "$probe_work/probe"
|
|
codesign --force --sign - "$probe_work/probe"
|
|
xcrun simctl spawn booted "$probe_work/probe" "$probe_work/results" \
|
|
"$PWD/android/app/src/androidTest/assets"
|
|
```
|
|
|
|
The audio package exposes HTTP but has no native HTTPS/TLS support. Remote motion
|
|
input requires the app's scoped Dart TLS proxy. To exercise remote input, append
|
|
a fixture URL as the last probe argument; use the proxy's HTTP loopback URL when
|
|
testing the application route. Passing a direct HTTPS URL intentionally reports
|
|
a capability failure on this package. Run the proxy's Dart tests and Android/iOS
|
|
application checks before claiming that remote motion playback is preserved.
|
|
|
|
Remote checks decode the complete fixture, stream-copy it to MP4 with faststart,
|
|
and decode the resulting MP4 with strict error handling. The probe also prints
|
|
the shipped HLS demuxer's options. For HLS fixtures with opaque segment URLs,
|
|
append `--disable-hls-extension-check` after the proxy URL; this passes
|
|
`-extension_picky 0` only for that input. The other HLS flags in the usage message
|
|
are diagnostic modes for comparing the native extension checks.
|
|
|
|
Verified on the shipped iOS simulator audio frameworks:
|
|
|
|
| HTTPS-origin fixture through the Dart proxy | Input options | Decode/remux/decode |
|
|
| --- | --- | --- |
|
|
| Redirected master playlist, AES-128 key, three TS segments | Defaults | Pass |
|
|
| Same content with `.bin`, extensionless and `.ts` segment URLs | Defaults | Rejects segment extension |
|
|
| Same opaque segment URLs | `-allowed_extensions ALL` | Rejects segment extension |
|
|
| Same opaque segment URLs | Both extension lists set to `ALL` | Rejects format/extension mismatch |
|
|
| Same opaque segment URLs | `-extension_picky 0` | Pass |
|
|
|
|
The app uses the final option for scoped HLS proxy input. The proxy still owns
|
|
the upstream URL allowlist, TLS requests, transfer budget and cancellation.
|