Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mfrashad
GitHub Repository: mfrashad/gancreate-saai
Path: blob/main/gancreate/lib/screens/animate_face.dart
330 views
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:image_picker/image_picker.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
import 'package:dio/dio.dart';
import 'dart:html' as html;
import 'dart:io';

class AnimateFace extends StatefulWidget {
  AnimateFace({Key? key}) : super(key: key);

  @override
  _AnimateFaceState createState() => _AnimateFaceState();
}

class _AnimateFaceState extends State<AnimateFace> {
  var dio = Dio();
  XFile?  _image;
  XFile? _video;
  String? _result;

  final picker = ImagePicker();

  VideoPlayerController? _videoPlayerController;
  VideoPlayerController? _resultVideoController;
  ChewieController? _chewieController;
  ChewieController? _resultChewieController;

  _pickImageFromGallery() async {
    XFile? image = await picker.pickImage(source: ImageSource.gallery, imageQuality: 50);

    setState(() {
        _image = image;    
    });
  }

  _pickVideo() async {
    _video = await picker.pickVideo(source: ImageSource.gallery);

    late VideoPlayerController controller;
    controller = kIsWeb? VideoPlayerController.network(_video!.path) :  VideoPlayerController.file(File(_video!.path));

    _videoPlayerController = controller
      ..initialize().then((_) {
        setState(() {});
        _videoPlayerController!.play();
      });

    _chewieController = ChewieController(
      videoPlayerController: _videoPlayerController!,
      autoPlay: false,
      looping: false,
    );
  }

  _submit() async {
      var formData = FormData.fromMap({
      'files': [
        MultipartFile.fromBytes((await _image!.readAsBytes()), filename: _image!.name),
        MultipartFile.fromBytes((await _video!.readAsBytes()), filename: _video!.name),
      ]
    });
    print('Sending request...');
    Response<dynamic> response = await dio.post('http://94b591f025a8.ngrok.io/animate/face', data: formData, options: Options(responseType: ResponseType.bytes));
    
    print(response.statusCode);
    var responseBytes = response.data;
    final blob = html.Blob([responseBytes]);
    final url = html.Url.createObjectUrlFromBlob(blob);
    _result = url;
    _resultVideoController= VideoPlayerController.network(url)
      ..initialize().then((_) {
        setState(() {});
        _videoPlayerController!.play();
      });

    _resultChewieController = ChewieController(
      videoPlayerController: _resultVideoController!,
      autoPlay: false,
      looping: false,
    );
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
        child: Center(
          child: Container(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              children: <Widget>[
                if (_image != null)
                  Container(
                    child: kIsWeb? Image.network(_image!.path) : Image.file(File(_image!.path)),
                    height: 300
                  )
                else
                  Text(
                    "Click on Pick Image to select an Image",
                    style: TextStyle(fontSize: 18.0),
                  ),
                ElevatedButton(
                  onPressed: () {
                    _pickImageFromGallery();
                  },
                  child: Text("Pick Image From Gallery"),
                ),
                SizedBox(
                  height: 16.0,
                ),
                if (_video != null)
                  Container(
                    child: _videoPlayerController!.value.isInitialized
                      ? Chewie(
                          controller: _chewieController!,
                        )
                        : Container(),
                    height: 300

                  )
                  
                else
                  Text(
                    "Click on Pick Video to select video",
                    style: TextStyle(fontSize: 18.0),
                  ),
                ElevatedButton(
                  onPressed: () {
                    _pickVideo();
                  },
                  child: Text("Pick Video From Gallery"),
                ),
                ElevatedButton(
                  onPressed: () {
                    _submit();
                  },
                  child: Text('Submit')
                ),
                if (_resultVideoController != null)
                  Container(
                    child: _resultVideoController!.value.isInitialized
                      ? Chewie(
                          controller: _resultChewieController!,
                        )
                        : Container(),
                    height: 300

                  )
              ],
            ),
          ),
        ),
      );
  }

  @override
  void dispose() {
    _videoPlayerController!.dispose();
    _chewieController!.dispose();
    super.dispose();
  }
}