参考
直播开播前的镜头调试,单纯的显示摄像头的内容
添加插件
camera: ^0.9.7+1
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
List<CameraDescription> cameras;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
runApp(CameraApp());
}
class CameraApp extends StatefulWidget {
@override
_CameraAppState createState() => _CameraAppState();
}
class _CameraAppState extends State<CameraApp> {
CameraController controller;
@override
void initState() {
super.initState();
controller = CameraController(cameras[0], ResolutionPreset.medium);
controller.initialize().then((_) {
if (!mounted) {
return;
}
setState(() {});
});
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!controller.value.isInitialized) {
return Container();
}
return AspectRatio(
aspectRatio:
controller.value.aspectRatio,
child: CameraPreview(controller));
}
}
我自己的代码,直播开播前的镜头调试,单纯的显示摄像头的内容
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../common/Global.dart';
import '../../common/backgroundWall.dart';
import '../../router.dart';
//开播页
class StartCameraSeeding extends StatefulWidget {
@override
StartCameraSeedingState createState() => StartCameraSeedingState();
}
class StartCameraSeedingState extends State<StartCameraSeeding> {
CameraController? controller;
late List<CameraDescription> cameras;
//前后摄像头设置
int frontCamera = 1;
@override
initState() {
//请求权限
if (Platform.isAndroid || Platform.isIOS) {
Permission.camera.request().then((value) async {
print('权限的值是多少${value}');
await Permission.microphone.request().then((value) {} );
});
}
super.initState();
//初始化镜头
initData().then((value) {});
}
initData() async {
cameras = await availableCameras();
controller = CameraController(cameras[frontCamera], ResolutionPreset.medium);
if (controller != null) {
controller!.initialize().then((_) {
if (!mounted) {
return;
}
mySetState(() {});
});
}
}
@override
void dispose() {
if (controller != null) {
controller!.dispose();
}
super.dispose();
}
mySetState(callBack) {
if (mounted) {
setState(() {
callBack();
});
}
}
@override
Widget build(BuildContext context) {
if (controller == null) {
return Container();
} else if (controller != null) {
if (!controller!.value.isInitialized) {
return Container();
}
}
return Material(
child: Stack(
alignment: Alignment.center,
children: [
// AspectRatio(
// aspectRatio: Global.screenWidth/Global.screenHeight,
// child: CameraPreview(controller!)),
//除以反转,就是正常的比例了,用Transform.scale放大填充满屏
Center(
child: Transform.scale(
scale: (1/controller!.value.aspectRatio)/deviceRatio,
child: AspectRatio(
aspectRatio: 1/controller!.value.aspectRatio,
child: CameraPreview(controller!)),
),
),
Column(
children: [
addHeadView(),
Container(
margin: const EdgeInsets.only(left: 20, right: 20, top: 50),
decoration: const BoxDecoration(color: Colors.transparent),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BackgroundWall(
width: 100,
height: 100,
hasPlaceholder: true,
radius: 4.r,
avatarUrl: 'assets/images/bg_none_nearby.png',
fit: BoxFit.cover,
),
Container(
margin: const EdgeInsets.only(top: 15),
alignment: Alignment.topLeft,
child: Column(
children: const [
Text(
'请输入直播标题',
style: TextStyle(color: Colors.white, fontSize: 15),
)
],
),
)
],
),
),
Expanded(child: Container()),
Row(
children: [
Expanded(
child: GestureDetector(
onTap: (){
MyRouter.pushMyMap(context, MyRouter.directSeedingAnchor,
{"type":1});
},
child: Container(
margin: const EdgeInsets.only(left: 5, right: 5, bottom: 10),
padding: const EdgeInsets.only(top: 10, bottom: 10),
decoration: BoxDecoration(
color: Colors.red, borderRadius: BorderRadius.circular(20)),
child: Container(
alignment: Alignment.center,
child: const Text(
'开启视频直播',
style: TextStyle(color: Colors.white, fontSize: 16),
),
),
),
),
),
GestureDetector(
onTap: (){
//前后镜头切换
if(frontCamera==1){
controller = CameraController(cameras[0], ResolutionPreset.medium);
if (controller != null) {
controller!.initialize().then((_) {
if (!mounted) {
return;
}
frontCamera=0;
mySetState((){});
});
}
}else{
controller = CameraController(cameras[1], ResolutionPreset.medium);
if (controller != null) {
controller!.initialize().then((_) {
if (!mounted) {
return;
}
frontCamera=1;
mySetState((){});
});
}
}
},
child: Container(
margin: const EdgeInsets.only(left: 5, right: 10, bottom: 10),
padding: const EdgeInsets.only(top: 10, bottom: 10),
child: const Image(
image: AssetImage('assets/images/bg_none_nearby.png'),
width: 35,
height: 35,
),
),
)
],
)
],
),
],
),
);
}
Widget addHeadView() {
return Container(
padding: EdgeInsets.only(top: Global.topHeight + 11.r, bottom: 20.r),
child: Row(children: [
GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: EdgeInsets.only(left: 15.r, right: 12.r),
child: const Image(
image: AssetImage('assets/images/icon_back@2x.png'),
width: 24,
height: 24,
color: Colors.white,
),
),
),
]));
}
}