flutter - Flutter - 将一个视频导航到另一个视频时出现初始化音频错误
问题描述
我有 5-6 个视频并将它们设置在滑块中。在从一个视频导航到另一个视频期间一切正常,但有时飞镖会产生以下错误,然后视频无法播放。我正在使用 video_player 标准播放器来播放视频。我在 Visual Studio 代码编辑器的调试控制台中遇到错误。
I/ExoPlayerImpl(30180): Release 80d07 [ExoPlayerLib/2.9.6] [mido, Redmi Note 4, Xiaomi, 24] [goog.exo.core]
I/ExoPlayerImpl(30180): Init d652959 [ExoPlayerLib/2.9.6] [mido, Redmi Note 4, Xiaomi, 24]
I/OMXClient(30180): MuxOMX ctor
I/MediaCodec(30180): [OMX.qcom.video.decoder.avc] setting surface generation to 30904353
I/ExtendedACodec(30180): setupVideoDecoder()
I/ExtendedACodec(30180): vpp-enable search is 0 and value is 0
I/ExtendedACodec(30180): Decoder will be in frame by frame mode
D/SurfaceUtils(30180): set up nativeWindow 0x7f5dbedc10 for 640x362, color 0x7fa30c06, rotation 0, usage 0x2002900
I/OMXClient(30180): MuxOMX ctor
I/ACodec (30180): codec does not support config priority (err -2147483648)
I/ACodec (30180): codec does not support config priority (err -2147483648)
D/SurfaceUtils(30180): set up nativeWindow 0x7f5dbedc10 for 640x368, color 0x7fa30c06, rotation 0, usage 0x2002900
E/AudioTrack(30180): AudioFlinger could not create track, status: -12
E/AudioTrack-JNI(30180): Error -12 initializing AudioTrack
E/android.media.AudioTrack(30180): Error code -20 when initializing AudioTrack.
E/ExoPlayerImplInternal(30180): Playback error.
E/ExoPlayerImplInternal(30180): com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(44100, 12, 56576)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.processOutputBuffer(MediaCodecAudioRenderer.java:646)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1355)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:663)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:529)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:300)
E/ExoPlayerImplInternal(30180): at android.os.Handler.dispatchMessage(Handler.java:98)
E/ExoPlayerImplInternal(30180): at android.os.Looper.loop(Looper.java:165)
E/ExoPlayerImplInternal(30180): at android.os.HandlerThread.run(HandlerThread.java:61)
E/ExoPlayerImplInternal(30180): Caused by: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(44100, 12, 56576)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.audio.DefaultAudioSink.initializeAudioTrack(DefaultAudioSink.java:1128)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.audio.DefaultAudioSink.initialize(DefaultAudioSink.java:532)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.audio.DefaultAudioSink.handleBuffer(DefaultAudioSink.java:593)
E/ExoPlayerImplInternal(30180): at com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.processOutputBuffer(MediaCodecAudioRenderer.java:640)
E/ExoPlayerImplInternal(30180): ... 7 more
I/ExoPlayerImpl(30180): Release d652959 [ExoPlayerLib/2.9.6] [mido, Redmi Note 4, Xiaomi, 24] [goog.exo.core]
我已经花了 10 多个小时来解决这个简单的问题,但还没有成功。
请建议我是什么问题以及我们如何解决它。非常感谢。
解决方案
我已经解决了这个问题。当您调用 dispose 时,VideoPlayer 小部件仍在使用您的控制器。首先,您需要确保不再使用它(将状态中的控制器设置为 null)并且在您调用 dispose 之后。
我不确定您通过 Provider 进行的状态管理,但我将举一个示例,说明如何使用常规状态执行此操作。
VideoPlayerController _controller;
void _initController(String link) {
_controller = VideoPlayerController.network(link)
..initialize().then((_) {
setState(() {});
});
}
Future<void> _onControllerChange(String link) async {
if (_controller == null) {
// If there was no controller, just create a new one
_initController(link);
} else {
// If there was a controller, we need to dispose of the old one first
final oldController = _controller;
// Registering a callback for the end of next frame
// to dispose of an old controller
// (which won't be used anymore after calling setState)
WidgetsBinding.instance.addPostFrameCallback((_) async {
await oldController.dispose();
// Initing new controller
_initController(link);
});
// Making sure that controller is not used by setting it to null
setState(() {
_controller = null;
});
}
}
这个解决方案对我有用。谢谢。
推荐阅读
- c# - 要成为 XML 可序列化的,从 IEnumerable 继承的类型必须在其继承的所有级别上都有 ADD(System.Object) 的实现
- flutter - webview_flutter 不适用于颤振 2(在颤振 2 前工作)
- android - Android WebView 中的深度链接
- c# - Visual Studio 阻止 WPF 项目中的串行端口连接
- python - 如何防止 python BeautifulSoup 用十六进制代码替换转义序列?
- optaplanner - 尝试在 Optaplanner 中启用多线程时没有已知的 workingObject
- php - SQL 错误访问论坛部分“查看您的帖子”
- jquery - 我无法将我在 jquery 中创建的按钮重定向到控制器
- python - 在 NetworkX 上使用广度优先搜索来查找前驱只为每个节点返回 1 个前驱
- swift - SwiftUI 中 Button 和 Image 的可点击区域