ワンクリックで
video-player
react-native-video integration: player component setup, controls overlay, streaming format support
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
react-native-video integration: player component setup, controls overlay, streaming format support
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
Template repo file structure: where screens, navigation, theme, data, and platform entries live in the monorepo
Android TV build and D-pad QA using Android CLI first, with bounded Gradle and ADB fallbacks
Expo Application Services cloud build configuration for TV app APK and IPA generation
Expo TV configuration: app.json plugins, prebuild settings, platform-specific config for react-native-tvos
Fire TV leanback manifest configuration: banner icons, LEANBACK_LAUNCHER intent filter, TV-specific Android settings
Gradle build commands: assembleDebug, assembleRelease, APK output paths, and emulator installation
SOC 職業分類に基づく
| name | video-player |
| description | react-native-video integration: player component setup, controls overlay, streaming format support |
| applies_to | ["phase_screens","phase_manifest"] |
| load_when | customizing the player, adding new stream types, debugging playback |
The template uses
react-native-videoon Expo platforms and@amazon-devices/kepler-mediaon Vega. Both are wrapped by the shared<Player>component. Most player work is about getting stream URLs and metadata right, not about touching the player guts.
stream_type | Player support | Notes |
|---|---|---|
hls (.m3u8) | All platforms | Default for live + adaptive VOD. Best choice. |
dash (.mpd) | Android TV, Fire TV (both), Web | Apple TV's support is partial. Prefer HLS on Apple TV. |
mp4 | All platforms | Single bitrate, large file. Fine for short clips, bad for full episodes. |
If the manifest mixes types: that's fine. The player reads stream_type and configures itself.
Apple TV's media pipeline expects HLS for live and most VOD. DASH works in some cases but has higher failure rates. For any Apple TV target, prefer HLS streams. If the source is DASH-only, the harness should flag it; it's still buildable but expect playback issues.
The shared <Player> has a .kepler.ts override that swaps react-native-video for @amazon-devices/kepler-media. Don't import react-native-video directly in a Vega screen — it will silently fail at runtime. Always use <Player> from packages/shared-ui.
v1 of the harness does not support DRM. The template's player is configured for clear streams only. If the manifest indicates DRM is needed:
Adding DRM requires:
react-native-video and kepler-media.This is multi-day work. If the user needs DRM, escalate — don't fake it.
The template ships overlay controls with:
D-pad bindings (already wired):
Don't rebind these. Users expect them.
The overlay is in packages/shared-ui/components/Player/Controls/. Reasonable customizations:
Avoid:
The player must handle these gracefully. The template does:
onError) → toast with error code, auto-return to detail after 5s, log to RunLog.onEnd) → either auto-play next (if useRelated() returns items) or return to detail.When a stream URL is dead, the user lands back on detail with a non-mysterious error. Black screen forever is the worst outcome.
react-native-video exposes them via selectedAudioTrack and selectedTextTrack.<Player> has hooks but doesn't ship a UI for switching. If the user's content needs CC (most accessibility-conscious apps do), add a controls-overlay menu.Most production apps want:
The player exposes onProgress, onBuffer, onBandwidthUpdate, onError. The harness doesn't need to wire telemetry in v1, but it should leave the hooks in place so adding analytics later is trivial.
| Symptom | Cause | Fix |
|---|---|---|
| Black screen, no error | Stream URL is HTTP, not HTTPS, and ATS / network security blocks it | Use HTTPS, or add per-domain ATS exception (Apple TV) / network security config (Android) |
| Plays on Web, not on Apple TV | DASH on Apple TV | Re-encode as HLS |
| Stutters on Fire TV (Fire OS only) | Bitrate too high for the device | Provide an HLS manifest with lower-bitrate variants |
| Crash on launch when player screen mounts | Source URL is undefined (manifest validation missed it) | Add the validation in manifest-wiring.md |
| Audio plays, no video | Codec unsupported on platform (e.g. HEVC on older Fire TVs) | Provide H.264 variant in HLS manifest |
| CC missing | Track not in HLS manifest, or wrong language code | Verify with ffprobe or HLS analyzer |
stream_type correct? hls for .m3u8, dash for .mpd, mp4 for direct files.<Player> is the shared-ui import, not react-native-video directly.onError has a code; look it up against react-native-video docs or Kepler media docs.<Video> on a new screen. Use shared <Player> even if it means lifting controls behavior.react-native-video in a .tsx file (no platform extension). That file resolves on Vega and breaks. Use <Player> or split with .kepler.ts.