正在开发一个 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');
}
}