我正在尝试直播,遵循以下文档:https://blog.flutterflow.io/flutter-mux-live-streaming/
然而,当点击我的相机按钮启动相机预览屏幕时,我收到一个运行时错误:
[VERBOSE-3:platform_message_handler_ios.mm(106)] Check failed: task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread().
* thread #6, queue = 'com.marshalltechnology.video_stream.dispatchqueue', stop reason = signal SIGABRT
frame #0: 0x00000001d9339b38 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill:
-> 0x1d9339b38 <+8>: b.lo 0x1d9339b58 ; <+40>
0x1d9339b3c <+12>: pacibsp
0x1d9339b40 <+16>: stp x29, x30, [sp, #-0x10]!
0x1d9339b44 <+20>: mov x29, sp
Target 0: (Runner) stopped.
Lost connection to device.
我怀疑这是视频流包的问题
当前正在使用这些包依赖项权限处理程序,视频流
这是以前在旧版本上工作的
我的Mac目前正在上运行
Flutter稳定3.0.5,Xcode 13.4.1
这是我的代码片段,与上面提供的文档非常相似
主要部分
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Get the available device cameras
try {
cameras = await availableCameras();
} on CameraException catch (e) {
debugPrint(e.toString());
}
runApp(const MyApp());
}
Livestream.dart
class LivestreamScreen extends StatefulWidget {
@override
State<LivestreamScreen> createState() => _LivestreamScreenState();
}
class _LivestreamScreenState extends State<LivestreamScreen> {
CameraController? _controller;
bool _isCameraPermissionGranted = false;
bool _isCameraInitialized = false;
bool _isInitializing = false;
bool _isStreaming = false;
bool _isFrontCamSelected = true;
_getPermissionStatus() async {
// Get the camera permission, if granted start initializing it
await Permission.camera.request();
var status = await Permission.camera.status;
if (status.isGranted) {
log('Camera Permission: GRANTED');
setState(() {
_isCameraPermissionGranted = true;
});
// Set and initialize the new camera with front camera
// camera[0]: Back camera of the device.
// camera[1]: Front camera of the device.
_onNewCameraSelected(cameras[1]);
} else {
log('Camera Permission: DENIED');
}
}
void _onNewCameraSelected(CameraDescription cameraDescription) async {
// Initialize a new camera
setState(() {
_isCameraInitialized = false;
});
final previousCameraController = _controller;
final CameraController cameraController = CameraController(
cameraDescription,
ResolutionPreset.high,
enableAudio: true,
androidUseOpenGL: true,
);
await previousCameraController?.dispose();
if (mounted) {
setState(() {
_controller = cameraController;
});
}
_controller!.addListener(() {
// _isStreaming = _controller!.value.isStreamingVideoRtmp;
_isCameraInitialized = _controller!.value.isInitialized;
if (mounted) setState(() {});
});
try {
await cameraController.initialize();
} on CameraException catch (e) {
log('Error initializing camera: $e');
}
if (mounted) {
setState(() {
_isCameraInitialized = _controller!.value.isInitialized;
});
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// App state changed before we got the chance to initialize.
if (_controller == null || !_controller!.value.isInitialized) {
return;
}
if (state == AppLifecycleState.inactive) {
_controller?.dispose();
} else if (state == AppLifecycleState.resumed) {
if (_controller != null) {
_onNewCameraSelected(_controller!.description!);
}
}
}
@override
void initState() {
_getPermissionStatus();
super.initState();
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build (BuildContext context) {
return Scaffold(
appBar: AppBar{
actions: [
IconButton(
onPressed: () {
_isFrontCamSelected
? _onNewCameraSelected(cameras[0])
: _onNewCameraSelected(cameras[1]);
setState(() {
_isFrontCamSelected = !_isFrontCamSelected;
}
);
},
],
body: Stack(
children: [
_isCameraPermissionGranted
? _isCameraInitialized
? Stack(
children: [
ClipRRect(
child: AspectRatio(
aspectRatio: _controller!.value.aspectRatio,
child: CameraPreview(_controller!),
),
),
// UI body code
],
: Center(
child: CircularProgressIndicator(),
)
: Column(
Text(
'Permission denied',
),
ElevatedButton(
onPressed: () {
_getPermissionStatus();
},
child: Text(
'Give permission'
),
}
)
],
),
],
),
),
}
感谢对的任何帮助
我试图将我的flutter降级到2.10.0,以测试这是否是包的兼容性问题,而且确实有效。猜测依赖关系中有一些突破性的变化。在此期间,我将寻找另一个包的变通方法