我正在尝试使用React Native视频包将exoplayer用于我的React Native应用程序.
我有一个带有HLS流和mp4视频的应用程序,这些视频存储在我的服务器(https)上.
浏览视频时,播放器会陷入无限缓冲状态并保持这种状态,直到我重新启动应用程序.这完全是随机的.重现问题的唯一方法是观看视频并多次切换源.
查看Android logcat时没有错误.adb bugreport也不起作用.
05-22 10:51:07.884 22911-22911/eu.domain.app I/EXO PLAYER: isBuffering - true
05-22 10:51:08.180 22911-25217/eu.domain.app I/ACodec: [] Now uninitialized
05-22 10:51:08.181 22911-25221/eu.domain.app I/ACodec: [] onAllocateComponent
05-22 10:51:08.184 22911-25221/eu.domain.app I/OMXClient: MuxOMX ctor
05-22 10:51:08.210 22911-25221/eu.domain.app I/ACodec: [OMX.Exynos.avc.dec] Now Loaded
05-22 10:51:08.214 22911-25220/eu.domain.app I/MediaCodec: [OMX.Exynos.avc.dec] setting surface generation to 23460870
05-22 10:51:08.217 22911-25221/eu.domain.app I/ACodec: can't find wfdsink-exynos-enable
05-22 10:51:08.226 22911-25221/eu.domain.app I/ACodec: codec does not support config priority (err -1010)
05-22 10:51:08.235 22911-25221/eu.domain.app I/ACodec: [OMX.Exynos.avc.dec] Now Loaded->Idle …Run Code Online (Sandbox Code Playgroud) 长期倾听者第一次来电。
到目前为止,当我导航到使用react-native-video的屏幕时,我还没有成功地从Spotify之类的应用程序中获取背景音乐,以便在我的react-native应用程序中保持活力。在 Android 上,无需进行任何更改即可运行。我正在使用react-native(非expo),目前正在testflight上进行测试。
如果这是重复的,请告诉我,但我只找到了很多关于如何让你的应用程序在后台播放的文章(我的问题是相反的),而且我可能不只知道 IOS 用于此类控制的术语。值得注意的是,该组件的一个实例确实包含音频,但大多数呈现的视频都没有音频。
我试过了:
AppDelegate.m
#import <AVFoundation/AVFoundation.h> // import
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; // allow
...
}
Run Code Online (Sandbox Code Playgroud)
ignoreSilentSwitch="ignore"和obeyObey成功允许背景音频继续,但将有音频的视频静音。在 xcode 中的我的应用程序目标上添加了背景模式 =“音频、Airplay 和画中画”功能。
哭了一会儿,质疑我的人生选择。
我使用react-native-video-controls实现了react-native-video,但据我了解,它是具有附加功能的同一模块。这是实现:
<VideoContainer>
<VideoPlayer
source={currentVideo}
navigator={null}
ref={videoRef}
resizeMode={'cover'}
controlTimeout={1500}
paused={isPaused}
repeat={true}
muted={true}
tapAnywhereToPause={true}
disableBack={true}
disableTimer={true}
disableVolume={true}
disableFullscreen={true}
showOnStart={true}
hideShutterView={true}
/>
</VideoContainer>
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助、建议、反馈或反驳!
我想react-native-video在我的项目中使用。安装这个包后我每次都会遇到这个错误(仅在android中)。我已经添加了文档中给出的所有附加代码。
我的react-native版本是:0.66.3
版本react-native-video是:5.2.0
有什么办法可以消除这个错误吗?
上下文:我正在尝试使用react-native-video. iOs 安装说明以npx pod-install.
跑步:
npx pod-install
Run Code Online (Sandbox Code Playgroud)
返回:
npx: installed 1 in 1.113s
Scanning for pods...
CocoaPods is not supported in this project
Run Code Online (Sandbox Code Playgroud)
输出消息对我还没有帮助。所以我去了npm pod-install。看起来它抽象了 CocoaPods 和 gem 复杂性。
有没有比学习 CocoaPods 和 gem 更简单的方法来解决这个问题?
包.json
{
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject"
},
"dependencies": {
"expo": "~37.0.3",
"react": "~16.9.0",
"react-dom": "~16.9.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz",
"react-native-video": "^4.4.5",
"react-native-web": "~0.11.7"
}, …Run Code Online (Sandbox Code Playgroud) 我正在使用CloudFront的流URL。
范例网址:https: //d14nt81hc5bide.cloudfront.net/qyYj1PcUkYg2ALDfzAdhZAmb
在android上,它运行良好,但在iOS中显示:domain = AVFoundationErrorDomain,代码= -11828
从Apple doc读取的错误代码11828为AVErrorFileFormatNotRecognized。无法打开媒体,因为它不是公认的格式。
有人可以建议如何解决此错误吗?
avfoundation ios amazon-cloudfront react-native react-native-video
在将我的应用升级到 react-native 0.59 时,我也升级react-native-video到了它的最新版本 4.4.1。当前发生的情况是,当尝试使用此库播放视频时,视频需要一段时间才能播放。视频的大小似乎无关紧要。视频存储在 S3 上,在我的测试环境中,视频由 链接Cloudfront,在我的本地环境中,视频由 S3 位置链接,但两种环境表现出的行为相同。
这仅适用于 Android,iOS 播放功能可在 1 秒内为相同视频准备就绪。
我尝试回滚react-native-video到以前的兼容版本,问题仍然存在。
不同的设备有不同的播放可用性等待时间。
由于使用需要 SDK 28 的 Firebase 版本,我无法使用 SDK 27。
IOException初始化组件以获取 S3 资源时会引发一个问题,但库最终确实获取了视频。
我不知道问题的确切原因,库是否在播放前下载视频,或者请求中是否需要包含标头。
这是尝试播放视频时的调试输出:
I/MediaPlayer: constructor
W/MediaPlayer: setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
cleanDrmObj: mDrmObj=null mDrmSessionId=null
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
cleanDrmObj: mDrmObj=null mDrmSessionId=null
I/MediaPlayer: setDataSource:<S3-url>/video.mp4
W/MediaPlayer: Couldn't open <S3-url>/video.mp4: java.io.FileNotFoundException: No content provider: <S3-url>/video.mp4
I/MediaPlayer: setDataSource:<S3-url>/video.mp4
V/MediaHTTPService: MediaHTTPService(android.media.MediaHTTPService@cefd526): Cookies: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 React Native 项目中包含 YouTube 视频。由于我已经尝试过react-native-youtube并且根本不起作用,所以我尝试安装react-native-video。
我尝试过:再次删除我的node_modules和npm,然后删除react-native链接和react-native链接react-native-video。几次。
我的package.json:
我正在尝试在我的视频流应用程序中实现本地视频缓存。
我正在使用:
我已经设法从一开始就开始下载,用本地 URL 替换原始 URL,然后继续从我的本地文件播放(它按预期工作) - 即使是部分文件(只要我从 0 开始)。
主要问题是搜索功能。如果用户想在例如 120 秒开始观看 - 下载仍将从 0B 开始。我在 Fetch API 中实现了Range 标头,看起来像这样:
"Range": "bytes: {oneSecondInBytes * whereYouWantToStartWatchingInSeconds}-{fileSizeInBytes}"
Run Code Online (Sandbox Code Playgroud)
来克服这个问题。现在下载从所需的字节开始,只下载视频文件的所需部分。
下载正常,但视频播放Unrecognized media format出错。还尝试在开头(0-10000B)为标题添加一些字节 - 尝试识别视频文件,但不走运。
所以我想知道是否可以使用 rn-fetch-blob 实现部分视频文件下载,并能够使用 react-native-video(不是从文件开头)播放文件,稍后还可以添加其他部分到文件(直到整个下载完成)。我怎么能说服 react-native-video 我的部分下载确实是正确的 mp4 文件?
更新
我已经搞砸了一段时间的 HTTP GET 标头,实际上已经到了某个地方。不是一个完整的解决方案,但可能会帮助某人:
"Content-Type": "video/mp4",
"Range": `bytes=0-1000, 45111150-`,
"Accept-Ranges": "bytes",
"Content-Length": "89024062"
Run Code Online (Sandbox Code Playgroud)
^^ 这些是我的测试标题。必须向 Range 添加两个值。第一个只是下载文件的第一部分以获取标题并识别文件类型。第二个是从“寻找点”开始。现在可以播放视频并识别文件类型。
javascript caching react-native react-native-fetch-blob react-native-video
在android上,当我导航到另一个屏幕(使用堆栈导航器或底部选项卡导航器)时,视频(使用react-native-video)会暂停,甚至被卸载,因为当我返回视频时,它会从媒体的开头再次开始(除非使用seek方法,否则无法恢复视频)。但在 iOS 上,当我导航到另一个屏幕(没有视频)时,视频仍在后台播放。
这是我想要的行为(在 iOS 上),因为我想在返回视频屏幕时恢复视频(我在反应导航中处理焦点/模糊事件的暂停/播放)。
无论如何,在 android 上有相同的行为吗?
我使用react-native-video v 5.1.1和react-navigation 4.4.4
我在这里提供了一个可复制的演示代码: repro
在 android 上运行此程序:导航到另一个屏幕时,视频停止
在 iOS 上运行这个:当导航到另一个屏幕时,视频继续播放(这就是我想要的)
我尝试使用所有视频道具,但没有成功。
视频加载错误时的错误代码
{"error": {"errorException": "com.google.android.exoplayer2.ExoPlaybackException: MediaCodecVideoRenderer error, index=0, format=Format(1, null, null, video/avc, avc1.640034, -1, null, [2160, 3840, 24.000002], [-1, -1]), format_supported=NO_EXCEEDS_CAPABILITIES", "errorString": "ExoPlaybackException type : 1"}}
Run Code Online (Sandbox Code Playgroud)
目前我正在使用这个版本并在真实的 Android 设备上构建
反应本机:0.64
反应本机视频:^5.2.0-alpha1
这是 h.264 视频示例:https://lifebeligum.s3.ap-southeast-1.amazonaws.com/documents/2021-10-04/ef07eb88-1e53-4800-b7cb-64e908a264c3.mp4
有人对此有什么想法吗?
react-native ×10
android ×5
exoplayer ×2
ios ×2
javascript ×2
avfoundation ×1
caching ×1
cocoapods ×1
expo ×1
pod-install ×1
reactjs ×1