在我的 flutter 应用程序中使用 vimeo api 努力将视频上传到 vimeo

问题描述 投票:0回答:0

正在开发一个 flutter web 应用程序,其中一部分是在 vimeo 上自动上传视频,因此人们可以通过该应用程序上传他们的视频。该代码正在 vimeo 上创建视频,但我陷入了转码。该项目的生产模型正在 google firebase 上运行,但我在我的计算机上本地托管它。

我尝试以不同的方式修改代码以使其上传而不是仅仅创建文件,但我陷入了以下困境(我已经注释掉了访问代码):

void _selectVideo() async {
    final html.InputElement input =
        html.document.createElement('input') as html.InputElement;
    input.type = 'file';
    input.accept = 'video/*';
    input.click();

    input.onChange.listen((html.Event event) {
      final html.File file = input.files!.first;
      if (file != null) {
        setState(() {
          _videoFile = file;
        });
        print('Video selected: ${file.name}');
      }
    });
  }

  Future<void> _uploadVideo() async {
    try {
      if (_videoFile == null) {
        print('No video file to upload');
        return;
      }
      final client = BrowserClient();
      String accessToken = 'my_access_code';

      String videoUri;

      // 1. Create the video
      final createVideoResponse = await client.post(
        Uri.parse('https://api.vimeo.com/me/videos'),
        headers: {
          'Authorization': 'Bearer $accessToken',
          'Content-Type': 'application/json',
          'Accept': 'application/vnd.vimeo.*+json;version=3.4',
        },
        body: jsonEncode({
          'name': _titleController.text,
          'privacy': {
            'view': 'anybody',
          },
        }),
      );

      if (createVideoResponse.statusCode == 201) {
        final jsonResponse = json.decode(createVideoResponse.body);
        videoUri = jsonResponse['uri'];
        print('Status code: ${createVideoResponse.statusCode}');
        print('Response body: ${createVideoResponse.body}');
      } else {
        print('Failed to create video on Vimeo');
        print('Status code: ${createVideoResponse.statusCode}');
        print('Response body: ${createVideoResponse.body}');
        return;
      }

// 2. Upload the video
      final videoId = videoUri.split('/').last;
      final getUploadTicketResponse = await client.get(
        Uri.parse('https://api.vimeo.com/videos/$videoId/upload_ticket'),
        headers: {
          'Authorization': 'Bearer $accessToken',
          'Accept': 'application/vnd.vimeo.*+json;version=3.4',
        },
      );

      if (getUploadTicketResponse.statusCode == 200) {
        final jsonResponse = json.decode(getUploadTicketResponse.body);
        final uploadLink = jsonResponse['upload']['upload_link'];

        final reader = html.FileReader();
        final completer = Completer<List<int>>();
        reader.onLoadEnd.listen((event) {
          completer.complete(reader.result as List<int>);
        });
        reader.readAsArrayBuffer(_videoFile!);
        final videoData = await completer.future;

        final uploadResponse = await client.put(
          Uri.parse(uploadLink),
          headers: {
            'Content-Type': 'binary/octet-stream',
            'Content-Length': videoData.length.toString(),
          },
          body: videoData,
        );

        if (uploadResponse.statusCode != 201) {
          print('Failed to upload video to Vimeo');
          print('Status code: ${uploadResponse.statusCode}');
          print('Response body: ${uploadResponse.body}');
          return;
        } else {
          final uploadCompleteResponse = await client.get(
            Uri.parse('https://api.vimeo.com/videos/$videoId'),
            headers: {
              'Authorization': 'Bearer $accessToken',
              'Accept': 'application/vnd.vimeo.*+json;version=3.4',
            },
          );
          if (uploadCompleteResponse.statusCode == 200) {
            final uploadCompleteJson = json.decode(uploadCompleteResponse.body);
            print('Uploaded video size: ${uploadCompleteJson['size']} bytes');
          } else {
            print('Failed to get uploaded video details');
            print('Status code: ${uploadCompleteResponse.statusCode}');
            print('Response body: ${uploadCompleteResponse.body}');
          }
        }
      } else {
        print('Failed to get upload ticket from Vimeo');
        print('Status code: ${getUploadTicketResponse.statusCode}');
        print('Response body: ${getUploadTicketResponse.body}');
        return;
      }
    } catch (e) {
      print('$e');
    }
  }
flutter vimeo vimeo-api
© www.soinside.com 2019 - 2024. All rights reserved.