尝试播放时出现视频缓冲 flutter dart
Video buffering when trying to play it flutter dart
我正在尝试使用 Flutter 和 Dart 创建狗 photo/video 生成器应用程序。它基本上向名为 random.Dog 的网站发送获取请求,以获取 url 以显示在我的应用程序上。有时 url 是视频,有时是 img。当它是视频时,我的应用程序只是缓冲并且此控制台消息不断出现:
E/flutter ( 4345): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception:
MissingPluginException(No implementation found for method init on channel better_player_channel)
E/flutter ( 4345): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345):
E/flutter ( 4345): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: MissingPluginException(No implementation found for method create on channel better_player_channel)
E/flutter ( 4345): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #1 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:358:43)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #2 MethodChannelVideoPlayer.create (package:better_player/src/video_player/method_channel_video_player.dart:38:9)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #3 VideoPlayerController._create (package:better_player/src/video_player/video_player.dart:202:18)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345):
I/flutter ( 4345): {"fileSizeBytes":3294982,"url":"https://random.dog/a922da9a-437c-4400-9d94-f36ec2e5452c.mp4"}
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 2)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/45600 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/CCodecConfig( 4345): query failed after returning 19 values (BAD_INDEX)
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 3
W/Codec2Client( 4345): query -- param skipped: index = 1342179345.
W/Codec2Client( 4345): query -- param skipped: index = 2415921170.
W/Codec2Client( 4345): query -- param skipped: index = 1610614798.
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
D/CCodecBuffers( 4345): int32_t aac-drc-album-mode = 0
D/CCodecBuffers( 4345): int32_t aac-drc-boost-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-cut-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-effect-type = 3
D/CCodecBuffers( 4345): int32_t aac-drc-heavy-compression = 3
D/CCodecBuffers( 4345): int32_t aac-drc-output-loudness = -1
D/CCodecBuffers( 4345): int32_t aac-encoded-target-level = -1
D/CCodecBuffers( 4345): int32_t aac-max-output-channel_count = 8
D/CCodecBuffers( 4345): int32_t aac-target-ref-level = 64
D/CCodecBuffers( 4345): int32_t channel-count = 1
D/CCodecBuffers( 4345): string mime = "audio/raw"
D/CCodecBuffers( 4345): int32_t sample-rate = 44100
D/CCodecBuffers( 4345): }
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 1
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
D/CCodecBuffers( 4345): int32_t aac-drc-album-mode = 0
D/CCodecBuffers( 4345): int32_t aac-drc-boost-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-cut-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-effect-type = 3
D/CCodecBuffers( 4345): int32_t aac-drc-heavy-compression = 1
D/CCodecBuffers( 4345): int32_t aac-drc-output-loudness = -1
D/CCodecBuffers( 4345): int32_t aac-encoded-target-level = -1
D/CCodecBuffers( 4345): int32_t aac-max-output-channel_count = 8
D/CCodecBuffers( 4345): int32_t aac-target-ref-level = 64
D/CCodecBuffers( 4345): int32_t channel-count = 1
D/CCodecBuffers( 4345): string mime = "audio/raw"
D/CCodecBuffers( 4345): int32_t sample-rate = 44100
D/CCodecBuffers( 4345): }
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/45824 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 1)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/chatty ( 4345): uid=10154(com.example.randomdog) HwBinder:4345_1 identical 4 lines
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46039 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 3)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 4)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46268 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 2)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 1)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46498 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 3)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 4)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/CCodecConfig( 4345): query failed after returning 19 values (BAD_INDEX)
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 3
W/Codec2Client( 4345): query -- param skipped: index = 1342179345.
W/Codec2Client( 4345): query -- param skipped: index = 2415921170.
W/Codec2Client( 4345): query -- param skipped: index = 1610614798.
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
而且我的视频确实出现在我的模拟器上。似乎是什么问题,我该如何解决?我的最小代码:
import 'package:better_player/better_player.dart';
void main() => runApp(MaterialApp(home: RandomDog()));
class RandomDog extends StatefulWidget {
@override
_RandomDogState createState() => _RandomDogState();
}
class _RandomDogState extends State<RandomDog> {
var headers = {'Content-Type': 'application/json'};
var body = {};
var video = false;
var img = false;
var message;
var loading = true;
var _controller;
@override
void initState() {
getDog();
super.initState();
}
getDog() async {
loading=true;
var response = await http.get(Uri.https('random.dog', '/woof.json'));
print(response.body);
message = jsonDecode(response.body);
if (message['url'].contains('gif') || message['url'].contains('png') ||
message['url'].contains('jpg') || message['url'].contains('jpeg')) {
video = false;
img = true;
} else {
video = true;
img = false;
}
loading = false;
setState(() {
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
. . .
body: Center(
child: loading == true ? CircularProgressIndicator() : Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Visibility(visible: img,
child: Image.network(message['url'], fit: BoxFit.scaleDown,)),
// Visibility(visible: video,child: VideoApp(url:message['url'])),
video == true? CircularProgressIndicator() :
Visibility(visible: video, child: BetterPlayer.network(message['url'],betterPlayerConfiguration: BetterPlayerConfiguration(autoPlay: true),)), //Chewie(controller: _controller,)
OutlinedButton(onPressed: () async {
getDog();
}, child: Text('GENERATE')),
],
),
),
);
}
}
希望此解决方案对您有用,尝试使用以下方法在函数 getDog() 中初始化 betterPlayer:
BetterPlayerController _betterPlayerController; //declare first
BetterPlayerDataSource betterPlayerDataSource = BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
"message[url]");
_betterPlayerController = BetterPlayerController(
BetterPlayerConfiguration(),
betterPlayerDataSource: betterPlayerDataSource);
然后在您的小部件中的 CircularProgressIndicator 之后添加:
BetterPlayer(
controller: _betterPlayerController, ),
我正在尝试使用 Flutter 和 Dart 创建狗 photo/video 生成器应用程序。它基本上向名为 random.Dog 的网站发送获取请求,以获取 url 以显示在我的应用程序上。有时 url 是视频,有时是 img。当它是视频时,我的应用程序只是缓冲并且此控制台消息不断出现:
E/flutter ( 4345): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception:
MissingPluginException(No implementation found for method init on channel better_player_channel)
E/flutter ( 4345): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345):
E/flutter ( 4345): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: MissingPluginException(No implementation found for method create on channel better_player_channel)
E/flutter ( 4345): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #1 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:358:43)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #2 MethodChannelVideoPlayer.create (package:better_player/src/video_player/method_channel_video_player.dart:38:9)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345): #3 VideoPlayerController._create (package:better_player/src/video_player/video_player.dart:202:18)
E/flutter ( 4345): <asynchronous suspension>
E/flutter ( 4345):
I/flutter ( 4345): {"fileSizeBytes":3294982,"url":"https://random.dog/a922da9a-437c-4400-9d94-f36ec2e5452c.mp4"}
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 2)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/45600 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/CCodecConfig( 4345): query failed after returning 19 values (BAD_INDEX)
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 3
W/Codec2Client( 4345): query -- param skipped: index = 1342179345.
W/Codec2Client( 4345): query -- param skipped: index = 2415921170.
W/Codec2Client( 4345): query -- param skipped: index = 1610614798.
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
D/CCodecBuffers( 4345): int32_t aac-drc-album-mode = 0
D/CCodecBuffers( 4345): int32_t aac-drc-boost-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-cut-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-effect-type = 3
D/CCodecBuffers( 4345): int32_t aac-drc-heavy-compression = 3
D/CCodecBuffers( 4345): int32_t aac-drc-output-loudness = -1
D/CCodecBuffers( 4345): int32_t aac-encoded-target-level = -1
D/CCodecBuffers( 4345): int32_t aac-max-output-channel_count = 8
D/CCodecBuffers( 4345): int32_t aac-target-ref-level = 64
D/CCodecBuffers( 4345): int32_t channel-count = 1
D/CCodecBuffers( 4345): string mime = "audio/raw"
D/CCodecBuffers( 4345): int32_t sample-rate = 44100
D/CCodecBuffers( 4345): }
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 1
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
D/CCodecBuffers( 4345): int32_t aac-drc-album-mode = 0
D/CCodecBuffers( 4345): int32_t aac-drc-boost-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-cut-level = 127
D/CCodecBuffers( 4345): int32_t aac-drc-effect-type = 3
D/CCodecBuffers( 4345): int32_t aac-drc-heavy-compression = 1
D/CCodecBuffers( 4345): int32_t aac-drc-output-loudness = -1
D/CCodecBuffers( 4345): int32_t aac-encoded-target-level = -1
D/CCodecBuffers( 4345): int32_t aac-max-output-channel_count = 8
D/CCodecBuffers( 4345): int32_t aac-target-ref-level = 64
D/CCodecBuffers( 4345): int32_t channel-count = 1
D/CCodecBuffers( 4345): string mime = "audio/raw"
D/CCodecBuffers( 4345): int32_t sample-rate = 44100
D/CCodecBuffers( 4345): }
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/45824 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 1)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/chatty ( 4345): uid=10154(com.example.randomdog) HwBinder:4345_1 identical 4 lines
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46039 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 3)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 4)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46268 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 2)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 1)
D/BufferPoolAccessor2.0( 4345): bufferpool2 0xeac5e4a8 : 5(40960 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 6/46498 (fetch/transfer)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 3)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 4)
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:1D-Input.Impl[N]] codec released a buffer owned by client (index 0)
I/CCodecConfig( 4345): query failed after returning 19 values (BAD_INDEX)
D/CCodecConfig( 4345): c2 config diff is c2::i32 coding.drc.compression-mode.value = 3
W/Codec2Client( 4345): query -- param skipped: index = 1342179345.
W/Codec2Client( 4345): query -- param skipped: index = 2415921170.
W/Codec2Client( 4345): query -- param skipped: index = 1610614798.
D/CCodecBuffers( 4345): [c2.android.aac.decoder#768:Output[N]] popFromStashAndRegister: output format changed to AMessage(what = 0x00000000) = {
而且我的视频确实出现在我的模拟器上。似乎是什么问题,我该如何解决?我的最小代码:
import 'package:better_player/better_player.dart';
void main() => runApp(MaterialApp(home: RandomDog()));
class RandomDog extends StatefulWidget {
@override
_RandomDogState createState() => _RandomDogState();
}
class _RandomDogState extends State<RandomDog> {
var headers = {'Content-Type': 'application/json'};
var body = {};
var video = false;
var img = false;
var message;
var loading = true;
var _controller;
@override
void initState() {
getDog();
super.initState();
}
getDog() async {
loading=true;
var response = await http.get(Uri.https('random.dog', '/woof.json'));
print(response.body);
message = jsonDecode(response.body);
if (message['url'].contains('gif') || message['url'].contains('png') ||
message['url'].contains('jpg') || message['url'].contains('jpeg')) {
video = false;
img = true;
} else {
video = true;
img = false;
}
loading = false;
setState(() {
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
. . .
body: Center(
child: loading == true ? CircularProgressIndicator() : Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Visibility(visible: img,
child: Image.network(message['url'], fit: BoxFit.scaleDown,)),
// Visibility(visible: video,child: VideoApp(url:message['url'])),
video == true? CircularProgressIndicator() :
Visibility(visible: video, child: BetterPlayer.network(message['url'],betterPlayerConfiguration: BetterPlayerConfiguration(autoPlay: true),)), //Chewie(controller: _controller,)
OutlinedButton(onPressed: () async {
getDog();
}, child: Text('GENERATE')),
],
),
),
);
}
}
希望此解决方案对您有用,尝试使用以下方法在函数 getDog() 中初始化 betterPlayer:
BetterPlayerController _betterPlayerController; //declare first
BetterPlayerDataSource betterPlayerDataSource = BetterPlayerDataSource(
BetterPlayerDataSourceType.network,
"message[url]");
_betterPlayerController = BetterPlayerController(
BetterPlayerConfiguration(),
betterPlayerDataSource: betterPlayerDataSource);
然后在您的小部件中的 CircularProgressIndicator 之后添加:
BetterPlayer(
controller: _betterPlayerController, ),