Cette page a été traduite automatiquement et peut contenir des erreurs. Lire l'original en anglais

API

Video

nsh exporte Video : un lecteur vidéo construit sur le lecteur de la plateforme (AVPlayer sur iOS et Mac Catalyst, MediaPlayer sur Android). La lecture se pilote par des props : mettre en pause revient donc à changer un signal.

import { Video, type VideoProps } from "nsh";

Voir Web view et vidéo pour le guide et <Video> pour ses props.

#Video

const Video: (props: VideoProps) => JSX.Element;

interface VideoProps extends Omit<ViewProps, "children">, VideoHostProps {
  src: string;
}
import { mount, signal, Text, Video, type VideoRef, View } from "nsh";

function Player() {
  const paused = signal(true);
  const time = signal("");
  let video!: VideoRef;
  return (
    <View style={{ flex: 1, padding: 16, gap: 12 }}>
      <Video
        ref={video}
        src="https://example.com/clip.mp4"
        paused={paused()}
        muted
        repeat
        class="object-cover"
        style={{ height: 220, borderRadius: 8, overflow: "hidden", backgroundColor: "#000" }}
        onProgress={(e) => time.set(`${e.currentTime.toFixed(1)} / ${e.duration.toFixed(1)} s`)}
      />
      <View style={{ flexDirection: "row", gap: 16 }}>
        <Text onPress={() => paused.update((p) => !p)}>{paused() ? "Play" : "Pause"}</Text>
        <Text onPress={() => video.seek(0)}>Restart</Text>
        <Text>{time()}</Text>
      </View>
    </View>
  );
}

mount(Player);

#Props

Video accepte les props de vue (style, classes, mise en page, accessibilité, ref ; pas d’enfants), ainsi que :

PropTypeDéfautDescription
srcstring(obligatoire)L’URL de la vidéo.
pausedbooleanfalseLa lecture est en pause.
mutedbooleanfalsePas de son.
volumenumber1De 0 à 1.
ratenumber1La vitesse de lecture.
repeatbooleanfalseRelance la lecture depuis le début une fois arrivée à la fin.
controlsbooleanfalseAffiche les contrôles de lecture de la plateforme.
objectFit (style), object-* classes"cover" | "contain" | "fill" | "none" | "scale-down""contain"La façon dont la vidéo s’ajuste à son cadre, comme le object-fit de CSS (class="object-cover").
progressUpdateIntervalnumber250Millisecondes entre deux événements onProgress.
audioSession"default" | "playback" | "mixWithOthers""default"L’effet du son sur le reste de l’audio de l’appareil : voir Le son et les autres apps.

#Le son et les autres apps

Le son d’une vidéo suit les réglages audio de l’app, qui sont par défaut ceux de la plateforme pour la vidéo : sur iOS, le mode silencieux de l’appareil le coupe. Une app qui diffuse de la parole, comme un livre audio ou un cours de langue, définit audioSession :

audioSessionEn mode silencieuxAudio des autres apps pendant la lecture
"default"les réglages audio de l’app décidentles réglages audio de l’app décident
"playback"le son est luse met en pause, puis reprend lorsque la vidéo est mise en pause, se termine ou s’en va
"mixWithOthers"le son est lucontinue de jouer

Ce réglage prend effet pendant la lecture de la vidéo. Sur iOS, la première vidéo de ce type à être lue fait passer AVAudioSession dans la catégorie playback avec le mode spokenAudio (mélange avec l’audio des autres apps pour "mixWithOthers"), et lorsqu’aucune n’est plus en lecture, la session revient à son état antérieur et les apps qu’elle avait mises en pause peuvent reprendre ; "default" laisse la session telle que l’app, ou l’app qui intègre NSH, l’a définie. Sur Android, le son du lecteur est marqué comme de la parole, et une vidéo "playback" prend le focus audio pendant sa lecture : elle se met en pause lorsqu’une autre app prend le focus (un appel, une consigne de navigation) et reprend lorsqu’il revient. Modifier audioSession sur Android rouvre la source. Sur les ordinateurs de bureau et sur le web, le son est lu comme pour n’importe quelle vidéo.

<Video src="asset:/greeting.m4a" audioSession="playback" />

#Événements

ÉvénementCharge utileQuand
onLoadStartLa vidéo commence à se charger.
onLoad{ duration: number; size: PixelSize }Elle est prête à être lue : sa durée en secondes et sa taille en pixels.
onProgress{ currentTime: number; duration: number }Pendant la lecture, toutes les progressUpdateInterval ms. En secondes.
onBuffer{ isBuffering: boolean }La lecture attend des données, ou reprend.
onEndLa lecture a atteint la fin.
onError{ message: string }La vidéo n’a pas pu être chargée ou lue.

#Méthodes de ref

MéthodeDescription
seek(seconds)Saute à seconds.
const aspect = signal(16 / 9);

<Video src={url} onLoad={(e) => aspect.set(e.size.width / e.size.height)} style={{ width: "100%", aspectRatio: aspect() }} />;

#Capacités

Lorsque votre app déclare capabilities dans nsh.json, les sources vidéo distantes doivent être autorisées sous network, comme fetch ; une source refusée n’affiche rien. Voir Sandbox et capacités.