From 4f27bfba01a6d3d726dc2304fdef886b34b0237f Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 16 Dec 2025 01:03:31 +0100 Subject: [PATCH] fixing video issue for pixel 10 --- CHANGELOG.md | 5 ++ .../api/mediafiles/upload.service.dart | 63 +++++++++++++++++-- .../mediafiles/compression.service.dart | 20 ++++-- pubspec.yaml | 2 +- 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dab8b69..41c538d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.0.74 + +- Improving uploading speed +- Fixing issue with ffmpeg for android + ## 0.0.73 - Integrated QR code scanner in the main camera diff --git a/lib/src/services/api/mediafiles/upload.service.dart b/lib/src/services/api/mediafiles/upload.service.dart index a6b5672..0c2e930 100644 --- a/lib/src/services/api/mediafiles/upload.service.dart +++ b/lib/src/services/api/mediafiles/upload.service.dart @@ -1,11 +1,13 @@ import 'dart:async'; import 'dart:convert'; import 'package:background_downloader/background_downloader.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:cryptography_flutter_plus/cryptography_flutter_plus.dart'; import 'package:cryptography_plus/cryptography_plus.dart'; import 'package:drift/drift.dart'; import 'package:fixnum/fixnum.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:http/http.dart' as http; import 'package:mutex/mutex.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/constants/secure_storage_keys.dart'; @@ -14,6 +16,7 @@ import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/model/protobuf/api/http/http_requests.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart'; +import 'package:twonly/src/services/api/mediafiles/media_background.service.dart'; import 'package:twonly/src/services/api/messages.dart'; import 'package:twonly/src/services/mediafiles/mediafile.service.dart'; import 'package:twonly/src/utils/log.dart'; @@ -322,10 +325,62 @@ Future _uploadUploadRequest(MediaFileService media) async { }, ); - Log.info('Enqueue upload task: ${task.taskId}'); + final connectivityResult = await Connectivity().checkConnectivity(); - await FileDownloader().enqueue(task); - - await media.setUploadState(UploadState.backgroundUploadTaskStarted); + if (!connectivityResult.contains(ConnectivityResult.mobile) && + !connectivityResult.contains(ConnectivityResult.wifi)) { + // no internet, directly put it into the background... + await FileDownloader().enqueue(task); + await media.setUploadState(UploadState.backgroundUploadTaskStarted); + Log.info('Enqueue upload task: ${task.taskId}'); + } else { + unawaited(uploadFileFastOrEnqueue(task, media)); + } }); } + +Future uploadFileFastOrEnqueue( + UploadTask task, + MediaFileService media, +) async { + final requestMultipart = http.MultipartRequest( + 'POST', + Uri.parse(task.url), + ); + + requestMultipart.headers.addAll(task.headers); + + requestMultipart.files.add( + await http.MultipartFile.fromPath( + 'file', + await task.filePath(), + filename: 'upload', + ), + ); + + try { + Log.info('Uploading fast: ${task.taskId}'); + final response = + await requestMultipart.send().timeout(const Duration(seconds: 4)); + var status = TaskStatus.failed; + if (response.statusCode == 200) { + status = TaskStatus.complete; + } else if (response.statusCode == 404) { + status = TaskStatus.notFound; + } + await handleUploadStatusUpdate( + TaskStatusUpdate( + task, + status, + null, + null, + null, + response.statusCode, + ), + ); + } catch (e) { + Log.info('Upload failed enqueuing task...'); + await FileDownloader().enqueue(task); + await media.setUploadState(UploadState.backgroundUploadTaskStarted); + } +} diff --git a/lib/src/services/mediafiles/compression.service.dart b/lib/src/services/mediafiles/compression.service.dart index b87757c..d2e492b 100644 --- a/lib/src/services/mediafiles/compression.service.dart +++ b/lib/src/services/mediafiles/compression.service.dart @@ -76,17 +76,29 @@ Future compressAndOverlayVideo(MediaFileService media) async { var overLayCommand = ''; if (media.overlayImagePath.existsSync()) { - overLayCommand = - '-i "${media.overlayImagePath.path}" -filter_complex "[1:v][0:v]scale2ref=w=ref_w:h=ref_h[ovr][base];[base][ovr]overlay=0:0"'; + if (Platform.isAndroid) { + overLayCommand = + '-i "${media.overlayImagePath.path}" -filter_complex "[1:v]format=yuva420p[ovr_in];[0:v]format=yuv420p[base_in];[ovr_in][base_in]scale2ref=w=rw:h=rh[ovr_out][base_out];[base_out][ovr_out]overlay=0:0"'; + } else { + overLayCommand = + '-i "${media.overlayImagePath.path}" -filter_complex "[1:v][0:v]scale2ref=w=ref_w:h=ref_h[ovr][base];[base][ovr]overlay=0:0"'; + } } final stopwatch = Stopwatch()..start(); + + var additionalParams = ''; + + if (Platform.isAndroid) { + additionalParams += ' -c:v libx264'; + } + var command = - '-i "${media.originalPath.path}" $overLayCommand -map "0:a?" -preset veryfast -crf 28 -c:a aac -b:a 64k "${media.ffmpegOutputPath.path}"'; + '-i "${media.originalPath.path}" $overLayCommand -map "0:a?" $additionalParams -preset veryfast -crf 28 -c:a aac -b:a 64k "${media.ffmpegOutputPath.path}"'; if (media.removeAudio) { command = - '-i "${media.originalPath.path}" $overLayCommand -preset veryfast -crf 28 -an "${media.ffmpegOutputPath.path}"'; + '-i "${media.originalPath.path}" $overLayCommand $additionalParams -preset veryfast -crf 28 -an "${media.ffmpegOutputPath.path}"'; } final session = await FFmpegKit.execute(command); diff --git a/pubspec.yaml b/pubspec.yaml index 474ef7d..9af96d9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec publish_to: 'none' -version: 0.0.73+73 +version: 0.0.74+74 environment: sdk: ^3.6.0