# react-native-video **Repository Path**: kunyuan-hongke/react-native-video ## Basic Information - **Project Name**: react-native-video - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-27 - **Last Updated**: 2025-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > 模板版本:v0.2.2

@ohmi/react-native-video

Supported platforms License

> [!TIP] [Gitee 地址](https://gitee.com/kunyuan-hongke/react-native-video) ## 安装与使用 请到三方库的 Releases 发布地址查看配套的版本信息:[@ohmi/react-native-video Releases](https://gitee.com/kunyuan-hongke/react-native-video/releases) 。对于未发布到npm的旧版本,请参考[安装指南](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/tgz-usage.md)安装tgz包。 进入到工程目录并输入以下命令: #### **npm** ```bash npm install @ohmi/react-native-video ``` #### **yarn** ```bash yarn add @ohmi/react-native-video ``` 下面的代码展示了这个库的基本使用场景: > [!WARNING] 使用时 import 的库名不变。 ```js import React, {useState, useRef} from "react"; import {View, ScrollView, StyleSheet, Text, TextInput} from "react-native"; import RNCVideo from "react-native-video"; function RNCVideoDemo() { const [muted, setMuted] = useState(true); const [paused, setPaused] = useState(false); const [repeat, setRepeat] = useState(true); const [controls, setControls] = useState(false); const [disableFocus, setDisableFocus] = useState(false); const [uri, setUri] = useState( "https://res.vmallres.com//uomcdn/CN/cms/202210/C75C7E20060F3E909F2998E13C3ABC03.mp4" ); const [txt, setTxt] = useState("empty"); const [resizeMode, setResizeMode] = useState("none"); const [posterResizeMode, setPosterResizeMode] = useState("cover"); const [seekSec, setSeekSec] = useState(5000); const [onVideoLoad, setOnVideoLoad] = useState("onVideoLoad"); const [onVideoLoadStart, setOnVideoLoadStart] = useState("onVideoLoadStart"); const [onVideoError, setOnVideoError] = useState("onVideoError"); const [onVideoProgress, setOnVideoProgress] = useState("onVideoProgress"); const [onVideoEnd, setOnVideoEnd] = useState("onVideoEnd"); const [onVideoBuffer, setOnVideoBuffer] = useState("onVideoBuffer"); const [onPlaybackStalled, setOnPlaybackStalled] = useState("onPlaybackStalled"); const [onPlaybackResume, setOnPlaybackResume] = useState("onPlaybackResume"); const videoRef = React.useRef < typeof RNCVideo > (); const toggleMuted = () => { setMuted((prevMuted) => !prevMuted); }; const toggleControls = () => { setControls((prevControls) => !prevControls); }; const togglePaused = () => { setPaused((prevPaused) => !prevPaused); }; const toggleRepeat = () => { setRepeat((prevRepeat) => !prevRepeat); }; const toggleDisableFocus = () => { setDisableFocus((prevDisableFocus) => !prevDisableFocus); }; const firstVideo = () => { setUri((prevRepeat) => "https://vjs.zencdn.net/v/oceans.mp4"); }; const secondVideo = () => { // setUri((prevRepeat) => 'http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4'); setUri( (prevRepeat) => "https://res.vmallres.com//uomcdn/CN/cms/202210/C75C7E20060F3E909F2998E13C3ABC03.mp4" ); }; const changeResizeMode = (resizeMode) => { setResizeMode((prevResizeMode) => resizeMode); }; return ( 网络视频demo {onVideoLoad} {onVideoError} {onVideoLoadStart} {onVideoProgress} {onVideoEnd} {onVideoBuffer} {onPlaybackStalled} {onPlaybackResume} update source { setUri( "https://res.vmallres.com//uomcdn/CN/cms/202210/C75C7E20060F3E909F2998E13C3ABC03.mp4" ); setPosterResizeMode("stretch"); }} > 切换net:vmallres { setUri("https://vjs.zencdn.net/v/oceans.mp4"); setPosterResizeMode("contain"); }} > 切换net:oceans set resizeMode { setResizeMode("none"); }} > none { setResizeMode("contain"); }} > contain { setResizeMode("stretch"); }} > stretch { setResizeMode("cover"); }} > cover 操作 { const newText = text.replace(/[^\d]+/, ""); setSeekSec(Number(newText)); }} autoFocus={false} /> { videoRef.current?.seek(seekSec); }} > seek:{seekSec.toString()} { togglePaused(); }} > paused:{paused.toString()} { toggleMuted(); }} > muted:{muted.toString()} { toggleControls() }}>controls:{controls.toString()} { toggleRepeat(); }} > repeat:{repeat.toString()} { toggleDisableFocus(); }} > disableFocus:{disableFocus.toString()} ReSizeMode:{resizeMode.toString()} { setOnVideoLoad( "onVideoLoad currentTime =" + e.currentPosition + "s duration =" + e.duration + "s width =" + e.naturalSize.width + " orientation =" + e.naturalSize.orientation ); setOnVideoError("onVideoError error = ok"); }} onLoadStart={(e) => { setOnVideoLoadStart( "onVideoLoadStart isNetwork =" + e.isNetwork + " type=" + e.type + " uri=" + e.uri ); }} onProgress={(e) => { setOnVideoProgress( "onVideoProgress currentTime =" + e.currentTime + " playableDuration=" + e.playableDuration + " seekableDuration=" + e.seekableDuration ); }} onError={(e) => { setOnVideoError("onVideoError error =" + e.error); }} onEnd={() => { setOnVideoEnd("onVideoEnd completed"); }} onBuffer={(e) => { setOnVideoBuffer("onVideoBuffer :" + e.isBuffering); }} onPlaybackStalled={() => { setOnPlaybackStalled("onPlaybackStalled : true"); setOnPlaybackResume("onPlaybackResume :false"); }} onPlaybackResume={() => { setOnPlaybackStalled("onPlaybackStalled :false"); setOnPlaybackResume("onPlaybackResume :true"); }} onReadyForDisplay={() => { console.log(`onReadyForDisplay :setShowPoster(false)`); }} /> ); } const styles = StyleSheet.create({ video: { width: "100%", height: 260, }, container: { width: "100%", height: "100%", backgroundColor: "#f8f8f8", }, title: { color: "white", width: "30%", // hack height: 30, // hack }, label: { color: "gray", width: "100%", // hack minHeight: 20, }, labelB: { color: "gray", width: "100%", // hack minHeight: 40, }, button: { width: 160, height: 36, backgroundColor: "hsl(190, 50%, 70%)", paddingHorizontal: 16, paddingVertical: 8, borderRadius: 8, }, buttonText: { width: "100%", height: "100%", fontWeight: "bold", }, button_b: { paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4, backgroundColor: "oldlace", alignSelf: "flex-start", marginHorizontal: "1%", marginBottom: 6, minWidth: "25%", minHeight: 20, textAlign: "center", }, prop_input: { width: 160, height: 40, borderWidth: 1, backgroundColor: "white", color: "black", borderRadius: 8, }, }); export default RNCVideoDemo; ``` ## Link 目前 HarmonyOS 暂不支持 AutoLink,所以 Link 步骤需要手动配置。 首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程 `harmony` ### 1.在工程根目录的 `oh-package.json5` 添加 overrides 字段 ```json { ... "overrides": { "@rnoh/react-native-openharmony": "./react_native_openharmony" } } ``` ### 2.引入原生端代码 目前有两种方法: 1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法); 2. 直接链接源码。 方法一:通过 har 包引入(推荐) > [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。 打开 `entry/oh-package.json5`,添加以下依赖 ```json "dependencies": { ... "@rnoh/react-native-openharmony": "file:../react_native_openharmony", "@ohmi/react-native-video": "file:../../node_modules/@ohmi/react-native-video/harmony/rn_video.har" } ``` 点击右上角的 `sync` 按钮 或者在终端执行: ```bash cd entry ohpm install ``` 方法二:直接链接源码 > [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/link-source-code.md) ### 3.配置 CMakeLists 和引入 RNCVideoPackage 打开 `entry/src/main/cpp/CMakeLists.txt`,添加: ```diff project(rnapp) cmake_minimum_required(VERSION 3.4.1) set(CMAKE_SKIP_BUILD_RPATH TRUE) set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules") + set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp") set(LOG_VERBOSITY_LEVEL 1) set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments") set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie") set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use add_compile_definitions(WITH_HITRACE_SYSTRACE) add_subdirectory("${RNOH_CPP_DIR}" ./rn) # RNOH_BEGIN: manual_package_linking_1 add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package) + add_subdirectory("${OH_MODULES}/@ohmi/react-native-video/src/main/cpp" ./video) # RNOH_BEGIN: manual_package_linking_1 file(GLOB GENERATED_CPP_FILES "./generated/*.cpp") add_library(rnoh_app SHARED ${GENERATED_CPP_FILES} "./PackageProvider.cpp" "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" ) target_link_libraries(rnoh_app PUBLIC rnoh) # RNOH_BEGIN: manual_package_linking_2 target_link_libraries(rnoh_app PUBLIC rnoh_sample_package) + target_link_libraries(rnoh_app PUBLIC rnoh_video) # RNOH_END: manual_package_linking_2 ``` 打开 `entry/src/main/cpp/PackageProvider.cpp`,添加: ```diff #include "RNOH/PackageProvider.h" #include "generated/RNOHGeneratedPackage.h" #include "SamplePackage.h" + #include "RNCVideoPackage.h" using namespace rnoh; std::vector> PackageProvider::getPackages(Package::Context ctx) { return { std::make_shared(ctx), std::make_shared(ctx), + std::make_shared(ctx) }; } ``` ### 4.在 ArkTs 侧引入 RNCVideo 组件 找到 **function buildCustomComponent()**,一般位于 `entry/src/main/ets/pages/index.ets` 或 `entry/src/main/ets/rn/LoadBundle.ets`,添加: ```diff ... + import { RNCVideo, RNC_VIDEO_TYPE } from "@ohmi/react-native-video" @Builder function buildCustomRNComponent(ctx: ComponentBuilderContext) { ... + if (ctx.componentName === RNC_VIDEO_TYPE) { + RNCVideo({ + ctx: ctx.rnComponentContext, + tag: ctx.tag + }) + } ... } ... ``` > [!TIP] 本库使用了混合方案,需要添加组件名。 在`entry/src/main/ets/pages/index.ets` 或 `entry/src/main/ets/rn/LoadBundle.ets` 找到常量 `arkTsComponentNames` 在其数组里添加组件名 ```diff const arkTsComponentNames: Array = [ ... + RNC_VIDEO_TYPE ]; ``` ### 5.在 ArkTs 侧引入 RNCVideoPackage 打开 `entry/src/main/ets/RNPackagesFactory.ts`,添加: ```diff ... + import { RNCVideoPackage } from '@ohmi/react-native-video/ts'; export function createRNPackages(ctx: RNPackageContext): RNPackage[] { return [ new SamplePackage(ctx), + new RNCVideoPackage(ctx) ]; } ``` ### 6.运行 点击右上角的 `sync` 按钮 或者在终端执行: ```bash cd entry ohpm install ``` 然后编译、运行即可。 ## 兼容性 要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机 ROM。 请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[@ohmi/react-native-video Releases](https://gitee.com/kunyuan-hongke/react-native-video/releases) ## 权限与要求 - 由于此库涉及后台播放,需要配置后台运行权限,权限需配置在entry/src/main目录下module.json5文件中。具体权限配置见文档:[程序访问控制](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/Readme-CN.md#/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/app-permission-mgmt-overview.md)。 - 此库后台播放功能需要添加权限:ohos.permission.KEEP_BACKGROUND_RUNNING,还需配置后台播放模式: ``` "abilities": [ { "backgroundModes": ["audioPlayback"] } ] ``` ## 属性 详情请查看[react-native-video 官方文档](https://github.com/react-native-video/react-native-video/blob/support/5.2.X/README.md) > [!TIP] "Platform"列表示该属性在原三方库上支持的平台。 > [!TIP] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 > iOS 或 Android 的效果。 | Name | 描述 | Type | Required | Platform | HarmonyOS Support | | ----------------------------------------- | ------------------------------------------------------------ | :------ | -------- | -------------------------------------------------------- | ----------------- | | `disableFocus` | 确定视频音频是否应覆盖 Android 和 HarmonyOS 设备中的背景音乐/音频。
**false (默认)** - 不覆盖背景音乐/音频 | boolean | No | Android Exoplayer | yes | | `muted` | 控制音频是否静音。
**false (默认)** - 不静音 | boolean | No | All | yes | | `paused` | 控制媒体是否暂停。
**false (默认)** - 不暂停媒体 | boolean | No | All | yes | | `repeat` | 确定是否在视频结束时重复播放。
**false (默认)** - 不重复播放 | boolean | No | All | yes | | `resizeMode` | 确定当帧与原始视频尺寸不匹配时如何调整视频大小。
**"none" (默认)** - 不应用调整大小 | string | No | Android ExoPlayer, Android MediaPlayer, iOS, Windows UWP | yes | | `volume` | 调整音量。
**1.0 (默认)** - 以全音量播放 | number | No | All | yes | | `poster` | 在视频加载时显示的图像
值:包含海报 URL 的字符串,例如 "" | string | No | All | yes | | `posterResizeMode` | 确定当帧与原始视频尺寸不匹配时如何调整海报图像大小。
**"contain" (默认)** - 按比例缩放图像(保持图像的宽高比),使得图像的宽度和高度都小于或等于视图的相应维度(减去内边距)。 | string | No | All | yes | | `allowsExternalPlayback` | 指示播放器是否允许切换到外部播放模式,例如 AirPlay 或 HDMI。 | boolean | No | iOS | No | | `audioOnly` | 指示播放器是否仅播放音频轨道,并且显示海报而不是视频轨道。 | boolean | No | All | No | | `onPlaybackStalled` | 缓冲开始时的回调,控制加载视图的显示 | boolean | No | Android | No | | `onPlaybackResume` | 缓存结束时的回调,控制加载视图的隐藏 | boolean | No | Android | No | | `automaticallyWaitsToMinimizeStalling` | 布尔值,指示播放器是否应自动延迟播放以最小化卡顿。适用于链接到 iOS 10.0 及更高版本的客户端 | boolean | No | iOS | No | | `bufferConfig` | 调整缓冲设置。此属性接受包含以下一个或多个属性的对象。 | object | No | Android | No | | `controls` | 确定是否显示播放器控件。 | boolean | No | All | yes | | `currentPlaybackTime` | 当播放带有 EXT-X-PROGRAM-DATE-TIME 标签配置的 HLS 实时流时,此属性将包含以毫秒为单位的纪元值。 | string | No | All | No | | `filter` | 添加视频滤镜 | string | No | iOS | No | | `filterEnabled` | 启用视频滤镜。 | string | No | iOS | No | | `fullscreen` | 控制播放时是否进入全屏模式。 | boolean | No | iOS | No | | `fullscreenAutorotate` | 如果设置了首选全屏方向,则会导致视频旋转到该方向,但允许用户持有的屏幕方向旋转。默认为 TRUE。 | boolean | No | iOS | No | | `fullscreenOrientation` | 设置全屏方向。 | string | No | iOS | No | | `headers` | 将标头传递给 HTTP 客户端。可用于授权。标头必须是源对象的一部分。 | object | No | Android | No | | `hideShutterView` | 控制是否启用 ExoPlayer 快门视图(加载时的黑屏)。 | boolean | No | Android | No | | `id` | 设置 DOM id 元素,以便可以在 Web 平台上使用 document.getElementById。接受字符串值。 | string | No | All | No | | `ignoreSilentSwitch` | 控制 iOS 静音开关的行为 | string | No | iOS | No | | `maxBitRate` | 设置网络带宽消耗的期望限制(以每秒比特数为单位),当播放列表中有多个视频流可用时。 | number | No | All | No | | `minLoadRetryCount` | 设置在失败并报告错误给应用程序之前最少重试加载数据的次数。有助于恢复短暂的互联网故障。 | number | No | Android | No | | `mixWithOthers` | 控制音频与其他应用程序的混合方式。 | string | No | iOS | No | | `pictureInPicture` | 确定媒体是否作为画中画播放。 | boolean | No | iOS | No | | `playInBackground` | 确定媒体是否在应用程序处于后台时继续播放。这允许客户继续收听音频。 | boolean | No | All | yes | | `playWhenInactive` | 确定媒体是否在通知或控制中心位于视频前面时继续播放。 | boolean | No | iOS | No | | `preferredForwardBufferDuration` | 播放器在网络中缓冲媒体的时间长度,以防止播放中断。设置 AVPlayerItem 的 preferredForwardBufferDuration 实例属性。 | number | No | iOS | No | | `preventsDisplaySleepDuringVideoPlayback` | 控制在播放视频时是否允许显示器休眠。默认不允许显示器休眠。 | boolean | No | All | No | | `progressUpdateInterval` | onProgress 事件之间的延迟,以毫秒为单位。 | number | No | iOS | No | | `rate` | 媒体播放的速度。 | number | No | All | yes | | `reportBandwidth` | 确定是否生成 onBandwidthUpdate 事件。这是由于 ExoPlayer 上这些事件的频率较高而需要的。 | boolean | No | Android | No | | `selectedAudioTrack` | 配置要播放的音频轨道(如果有)。 | object | No | All | No | | `selectedTextTrack` | 配置要显示的文本轨道(字幕或隐藏字幕)(如果有)。 | object | No | All | No | | `selectedVideoTrack` | 配置要播放的视频轨道。默认情况下,播放器使用自适应比特率流技术,根据可用带宽自动选择其认为性能最佳的流。 | object | No | Android | No | | `stereoPan` | 调整左右音频通道的平衡。接受 –1.0 到 1.0 之间的任何值。 | number | No | Android | No | | `textTracks` | 加载一个或多个“旁白”文本轨道。此属性接受代表每个轨道的对象数组。 | object | No | All | No | | `trackId` | 配置视频流的标识符,以将播放上下文链接到发出的事件。 | string | No | Android | No | | `useTextureView` | 控制是否输出到 TextureView 或 SurfaceView。 | boolean | No | Android | No | ## 事件回调 > [!TIP] "Platform"列表示该属性在原三方库上支持的平台。 > [!TIP] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 > iOS 或 Android 的效果。 | Name | 描述 | Type | Required | Platform | HarmonyOS Support | | ----------------------------------------------- | ------------------------------------------------------------ | :------- | -------- | ------------------------------------------------ | ----------------- | | `onLoad` | 媒体加载并准备好播放时调用的回调函数。 | function | No | All | yes | | `onLoadStart` | 媒体开始加载时调用的回调函数。 | function | No | All | yes | | `onReadyForDisplay` | 第一帧视频准备好显示时调用的回调函数。这就是移除海报的时候。 | function | No | Android ExoPlayer, Android MediaPlayer, iOS, Web | yes | | `onProgress` | 每隔 progressUpdateInterval 秒调用一次的回调函数,提供当前播放位置的信息。 | function | No | All | yes | | `onEnd` | 播放器到达媒体结尾时调用的回调函数。 | function | No | All | yes | | `onError` | 播放器遇到播放错误时调用的回调函数。 | function | No | All | yes | | `onBuffer` | 播放器缓冲时调用的回调函数。 | function | No | Android, iOS | yes | | `onPlaybackStalled` | MediaPlayer MEDIA_INFO_BUFFERING_START 的回调函数 | function | No | Android MediaPlayer | yes | | `onPlaybackResume` | MediaPlayer MEDIA_INFO_BUFFERING_END 的回调函数 | function | No | Android MediaPlayer | yes | | `onAudioBecomingNoisy` | 当音频因音频输出变化即将变得“嘈杂”时调用的回调函数。通常是在音频输出从外部来源(如耳机)切换回内部扬声器时调用。在这种情况下,最好暂停媒体以免扬声器突然开始大声播放声音。 | function | No | All | No | | `onBandwidthUpdate` | 当可用带宽发生变化时调用的回调函数。 | function | No | Android | No | | `onExternalPlaybackChange` | 当前播放视频的外部播放模式发生更改时调用的回调函数。主要用于连接/断开 Apple TV 时——在连接/断开时调用。 | function | No | iOS | No | | `onFullscreenPlayerWillPresent` | 播放器即将进入全屏模式时调用的回调函数。 | function | No | All | No | | `onFullscreenPlayerDidPresent` | 播放器已进入全屏模式时调用的回调函数。 | function | No | All | No | | `onFullscreenPlayerWillDismiss` | 播放器即将退出全屏模式时调用的回调函数。 | function | No | All | No | | `onFullscreenPlayerDidDismiss` | 播放器已退出全屏模式时调用的回调函数。 | function | No | All | No | | `onPictureInPictureStatusChanged` | 当画中画变为活动或非活动状态时调用的回调函数。 | function | No | IOS | No | | `onPlaybackRateChange` | 播放速率更改时调用的回调函数——无论是暂停还是开始/恢复。 | function | No | All | yes | | `onSeek` | 寻找完成时调用的回调函数。 | function | No | All | yes | | `onRestoreUserInterfaceForPictureInPictureStop` | 对应于 Apple 的 restoreUserInterfaceForPictureInPictureStopWithCompletionHandler。在此函数中调用 restoreUserInterfaceForPictureInPictureStopCompleted 以完成用户界面恢复。 | function | No | iOS | No | | `onTimedMetadata` | 当定时元数据可用时调用的回调函数 | function | No | All | No | ## 静态方法 > [!TIP] "Platform"列表示该属性在原三方库上支持的平台。 > [!TIP] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 > iOS 或 Android 的效果。 | Name | 描述 | Type | Required | Platform | HarmonyOS Support | |-------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|----------|----------|----------|-------------------| | `seek()` | 跳转到由秒表示的指定位置。seconds 是一个浮点值。 | function | No | All | yes | | `dismissFullscreenPlayer()` | 退出全屏模式。 | function | No | All | No | | `presentFullscreenPlayer()` | 进入全屏模式。 | function | No | All | No | | `save()` | 使用当前滤镜属性将视频保存到照片中。返回 promise。 | function | No | iOS | No | | `restoreUserInterfaceForPictureInPictureStop()` | 对应于 Apple 的恢复用户界面 ForPictureInPictureStop 完成处理程序。重要提示:必须在调用 onRestoreUserInterfaceForPictureInPictureStop 后调用此函数。 | function | No | iOS | No | ## 遗留问题 - [x] source 暂时只支持在线 URL 资源问题: [issue#34](https://github.com/react-native-oh-library/react-native-video/issues/34)。 - [x] react-native-video 部分属性和方法未实现 HarmonyOS 化: [issue#60](https://github.com/react-native-oh-library/react-native-video/issues/60)。 ## 其他 ## 开源协议 本项目基于 [The MIT License (MIT)](https://github.com/TheWidlarzGroup/react-native-video/blob/master/LICENSE) ,请自由地享受和参与开源。