1、播放视频
class _VideoDetailPagerState extends State<VideoDetailPager> {
late VideoPlayerController videoPlayerController;
late ChewieController chewieController;
@override
void initState() {
super.initState();
_initVideo();
}
_initVideo() async {
videoPlayerController = VideoPlayerController.networkUrl(
Uri.parse('https://media.w3.org/2010/05/sintel/trailer.mp4'));
chewieController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: 3 / 2,
autoPlay: true,
looping: true,
optionsBuilder: (context, defaultOptions) async {
//defaultOptions保存了对应的按钮 先打印然后再去自定义
return await showModalBottomSheet(
context: context,
builder: (context) {
return SizedBox(
height: 120,
child: ListView(
children: [
ListTile(
title: const Text("播放速度"),
onTap: () {
defaultOptions[0].onTap!();
},
),
ListTile(
title: const Text("取消"),
onTap: () {
Navigator.of(context).pop();
},
)
],
),
);
});
},
);
}
/*销毁*/
@override
void dispose() {
videoPlayerController.dispose();
chewieController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('在线视频播放'),
),
body: Center(
child: SizedBox(
child: AspectRatio(
aspectRatio: 3 / 2,
child: Chewie(
controller: chewieController,
),
),
)),
);
}
}
2、ImagePicker拍照、录制视频、相册选择照片、相册选择视频
注意:android无需配置开箱即用,ios还需要配置info.plist
<key>NSPhotoLibraryUsageDescription</key>
<string>应用需要访问相册读取文件</string>
<key>NSCameraUsageDescription</key>
<string>应用需要访问相机拍照</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用需要访问麦克风录制视频</string>
注意:使用相机拍摄的图像和视频会保存到应用程序的本地缓存中,因此应该只是暂时存在。如果您需
要永久存储您挑选的图像,您有责任将其移动到更永久的位置
ImagePicker拍照、相册选择照片及上传
class _ImageChoicePagerState extends State<ImageChoicePager> {
ImagePicker imagePicker = ImagePicker();
XFile? xFile;
//拍照
takePhoto() async {
XFile? pickFile = await imagePicker.pickImage(
source: ImageSource.camera, maxHeight: 600, maxWidth: 600);
if (pickFile != null) {
setState(() {
xFile = pickFile;
});
//上传图片
uploadFile(pickFile.path);
}
}
//相册
openGallery() async {
XFile? pickFile = await imagePicker.pickImage(
source: ImageSource.gallery, maxHeight: 600, maxWidth: 600);
if (pickFile != null) {
setState(() {
xFile = pickFile;
});
//上传图片
uploadFile(pickFile.path);
}
}
uploadFile(String imagePath) async {
var formData = FormData.fromMap({
'name': 'wendux',
'age': 25,
'file': await MultipartFile.fromFile(imagePath, filename: 'aaa.png'),
});
var response =
await Dio().post('https://jdmall.itying.com/imgupload', data: formData);
print(response);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("title")),
body: Center(
child: ListView(padding: const EdgeInsets.all(12), children: [
ElevatedButton(onPressed: takePhoto, child: const Text("拍照")),
const SizedBox(
height: 20,
),
ElevatedButton(onPressed: openGallery, child: const Text("相册选择")),
const SizedBox(
height: 20,
),
xFile == null
? const Text("选择图片")
: Image.file(File(xFile!.path)), //引入dart:io库
]),
),
);
}
}
ImagePicker录制视频、相册选择视频及上传
class _VideoChoicePagerState extends State<VideoChoicePager> {
ImagePicker imagePicker = ImagePicker();
XFile? xFile;
late ChewieController chewieController;
late VideoPlayerController videoPlayerController;
initVideo(fileDir) async {
videoPlayerController = VideoPlayerController.file(fileDir);
//初始化完成后才可以获取宽高比
await videoPlayerController.initialize();
chewieController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: videoPlayerController.value.aspectRatio, //配置视频的宽高比
autoPlay: true,
);
}
@override
void dispose() {
super.dispose();
videoPlayerController.dispose();
chewieController.dispose();
}
//录制视频
takePhoto() async {
XFile? pickFile = await imagePicker.pickVideo(source: ImageSource.camera);
if (pickFile != null) {
await initVideo(File(pickFile.path)); //引入dart:io库
setState(() {
xFile = pickFile;
});
//上传视频
uploadFile(pickFile.path);
}
}
//相册视频选择
openGallery() async {
XFile? pickFile = await imagePicker.pickVideo(source: ImageSource.gallery);
if (pickFile != null) {
await initVideo(File(pickFile.path)); //引入dart:io库
setState(() {
xFile = pickFile;
});
//上传视频
uploadFile(pickFile.path);
}
}
uploadFile(String videoPath) async {
var formData = FormData.fromMap({
'name': 'videoName',
'age': 35,
'file': await MultipartFile.fromFile(videoPath, filename: 'aaa.mp4'),
});
var response =
await Dio().post('https://jdmall.itying.com/imgupload', data: formData);
print(response);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("title")),
body: Center(
child: ListView(padding: const EdgeInsets.all(12), children: [
ElevatedButton(onPressed: takePhoto, child: const Text("录制视频")),
const SizedBox(
height: 20,
),
ElevatedButton(onPressed: openGallery, child: const Text("相册视频选择")),
const SizedBox(
height: 20,
),
xFile == null
? const Text("选择视频")
: AspectRatio(
aspectRatio: videoPlayerController.value.aspectRatio,
child: Chewie(controller: chewieController),
),
]),
),
);
}
}