fix: Workaround for reversed width and height of compressed videos sent from Android
This commit is contained in:
parent
b8d64a113e
commit
3d0a3ee226
3 changed files with 31 additions and 15 deletions
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||
|
|
@ -36,11 +38,14 @@ class EventVideoPlayer extends StatelessWidget {
|
|||
.tryGet<String>('xyz.amorgan.blurhash') ??
|
||||
fallbackBlurHash;
|
||||
final fileDescription = event.fileDescription;
|
||||
const maxDimension = 300.0;
|
||||
final infoMap = event.content.tryGetMap<String, Object?>('info');
|
||||
final videoWidth = infoMap?.tryGet<int>('w') ?? 400;
|
||||
final videoHeight = infoMap?.tryGet<int>('h') ?? 300;
|
||||
const height = 300.0;
|
||||
final width = videoWidth * (height / videoHeight);
|
||||
final videoWidth = infoMap?.tryGet<int>('w') ?? maxDimension;
|
||||
final videoHeight = infoMap?.tryGet<int>('h') ?? maxDimension;
|
||||
|
||||
final modifier = max(videoWidth, videoHeight) / maxDimension;
|
||||
final width = videoWidth / modifier;
|
||||
final height = videoHeight / modifier;
|
||||
|
||||
final durationInt = infoMap?.tryGet<int>('duration');
|
||||
final duration =
|
||||
|
|
|
|||
|
|
@ -59,16 +59,22 @@ class SendFileDialogState extends State<SendFileDialog> {
|
|||
final length = await xfile.length();
|
||||
final mimeType = xfile.mimeType ?? lookupMimeType(xfile.path);
|
||||
|
||||
// Generate video thumbnail
|
||||
if (PlatformInfos.isMobile &&
|
||||
mimeType != null &&
|
||||
mimeType.startsWith('video')) {
|
||||
scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail);
|
||||
thumbnail = await xfile.getVideoThumbnail();
|
||||
}
|
||||
|
||||
// If file is a video, shrink it!
|
||||
if (PlatformInfos.isMobile &&
|
||||
mimeType != null &&
|
||||
mimeType.startsWith('video') &&
|
||||
length > minSizeToCompress &&
|
||||
compress) {
|
||||
mimeType.startsWith('video')) {
|
||||
scaffoldMessenger.showLoadingSnackBar(l10n.compressVideo);
|
||||
file = await xfile.resizeVideo();
|
||||
scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail);
|
||||
thumbnail = await xfile.getVideoThumbnail();
|
||||
file = await xfile.getVideoInfo(
|
||||
compress: length > minSizeToCompress && compress,
|
||||
);
|
||||
} else {
|
||||
if (length > maxUploadSize) {
|
||||
throw FileTooBigMatrixException(length, maxUploadSize);
|
||||
|
|
|
|||
|
|
@ -8,22 +8,27 @@ extension ResizeImage on XFile {
|
|||
static const int max = 1200;
|
||||
static const int quality = 40;
|
||||
|
||||
Future<MatrixVideoFile> resizeVideo() async {
|
||||
Future<MatrixVideoFile> getVideoInfo({bool compress = true}) async {
|
||||
MediaInfo? mediaInfo;
|
||||
try {
|
||||
if (PlatformInfos.isMobile) {
|
||||
// will throw an error e.g. on Android SDK < 18
|
||||
mediaInfo = await VideoCompress.compressVideo(path);
|
||||
mediaInfo = compress
|
||||
? await VideoCompress.compressVideo(path, deleteOrigin: true)
|
||||
: await VideoCompress.getMediaInfo(path);
|
||||
}
|
||||
} catch (e, s) {
|
||||
Logs().w('Error while compressing video', e, s);
|
||||
Logs().w('Error while fetching video media info', e, s);
|
||||
}
|
||||
|
||||
return MatrixVideoFile(
|
||||
bytes: (await mediaInfo?.file?.readAsBytes()) ?? await readAsBytes(),
|
||||
name: name,
|
||||
mimeType: mimeType,
|
||||
width: mediaInfo?.width,
|
||||
height: mediaInfo?.height,
|
||||
// on Android width and height is reversed:
|
||||
// https://github.com/jonataslaw/VideoCompress/issues/172
|
||||
width: PlatformInfos.isAndroid ? mediaInfo?.height : mediaInfo?.width,
|
||||
height: PlatformInfos.isAndroid ? mediaInfo?.width : mediaInfo?.height,
|
||||
duration: mediaInfo?.duration?.round(),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue