diff --git a/lib/http/download.dart b/lib/http/download.dart index 63364c6b6..c05093cb5 100644 --- a/lib/http/download.dart +++ b/lib/http/download.dart @@ -161,6 +161,7 @@ abstract final class DownloadHttp { dashDrmType: 0, ), ]; + entry.hasDashAudio = true; } return Type2( duration: dash.duration!, diff --git a/lib/models_new/download/bili_download_entry_info.dart b/lib/models_new/download/bili_download_entry_info.dart index 9d56e1a23..3e6fe5ebf 100644 --- a/lib/models_new/download/bili_download_entry_info.dart +++ b/lib/models_new/download/bili_download_entry_info.dart @@ -7,7 +7,7 @@ import 'package:get/route_manager.dart'; class BiliDownloadEntryInfo with MultiSelectData { int mediaType; - final bool hasDashAudio; + bool hasDashAudio; bool isCompleted; int totalBytes; int downloadedBytes; diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index 850c7cb9f..80e35b1be 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -687,6 +687,7 @@ class VideoDetailController extends GetxController dir: args['dirPath'], typeTag: entry.typeTag!, isMp4: entry.mediaType == 1, + hasDashAudio: entry.hasDashAudio, ) : NetworkSource( videoSource: video ?? videoUrl!, diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 78578d6ce..a4369b5f9 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -788,33 +788,32 @@ class PlPlayerController with BlockConfigMixin { extras['audio-files'] = '"${Platform.isWindows ? audio.replaceAll(';', r'\;') : audio.replaceAll(':', r'\:')}"'; } - } - - if (kDebugMode || Platform.isAndroid) { - String audioNormalization = AudioNormalization.getParamFromConfig( - Pref.audioNormalization, - ); - if (volume != null && volume.isNotEmpty) { - audioNormalization = audioNormalization.replaceFirstMapped( - loudnormRegExp, - (i) => - 'loudnorm=${volume.format( - Map.fromEntries( - i.group(1)!.split(':').map((item) { - final parts = item.split('='); - return MapEntry(parts[0].toLowerCase(), num.parse(parts[1])); - }), - ), - )}', + if (kDebugMode || Platform.isAndroid) { + String audioNormalization = AudioNormalization.getParamFromConfig( + Pref.audioNormalization, ); - } else { - audioNormalization = audioNormalization.replaceFirst( - loudnormRegExp, - AudioNormalization.getParamFromConfig(Pref.fallbackNormalization), - ); - } - if (audioNormalization.isNotEmpty) { - extras['lavfi-complex'] = '"[aid1] $audioNormalization [ao]"'; + if (volume != null && volume.isNotEmpty) { + audioNormalization = audioNormalization.replaceFirstMapped( + loudnormRegExp, + (i) => + 'loudnorm=${volume.format( + Map.fromEntries( + i.group(1)!.split(':').map((item) { + final parts = item.split('='); + return MapEntry(parts[0].toLowerCase(), num.parse(parts[1])); + }), + ), + )}', + ); + } else { + audioNormalization = audioNormalization.replaceFirst( + loudnormRegExp, + AudioNormalization.getParamFromConfig(Pref.fallbackNormalization), + ); + } + if (audioNormalization.isNotEmpty) { + extras['lavfi-complex'] = '"[aid1] $audioNormalization [ao]"'; + } } } @@ -840,21 +839,21 @@ class PlPlayerController with BlockConfigMixin { SmartDialog.showToast('视频源为空,请重新进入本页面'); return false; } - String? audioUri; - if (!isLive) { - if (dataSource.audioSource.isNullOrEmpty) { - SmartDialog.showToast('音频源为空'); + final Map extras = {}; + String video = dataSource.videoSource; + if (dataSource.audioSource case final audio? when (audio.isNotEmpty)) { + if (onlyPlayAudio.value) { + video = audio; } else { - audioUri = Platform.isWindows - ? dataSource.audioSource!.replaceAll(';', '\\;') - : dataSource.audioSource!.replaceAll(':', '\\:'); + extras['audio-files'] = + '"${Platform.isWindows ? audio.replaceAll(';', r'\;') : audio.replaceAll(':', r'\:')}"'; } } await _videoPlayerController!.open( Media( - dataSource.videoSource, + video, start: position, - extras: audioUri == null ? null : {'audio-files': '"$audioUri"'}, + extras: extras.isEmpty ? null : extras, ), play: true, ); diff --git a/lib/plugin/pl_player/models/data_source.dart b/lib/plugin/pl_player/models/data_source.dart index 4a1671a1d..98edc3449 100644 --- a/lib/plugin/pl_player/models/data_source.dart +++ b/lib/plugin/pl_player/models/data_source.dart @@ -25,6 +25,7 @@ class FileSource extends DataSource { FileSource({ required this.dir, required this.isMp4, + required bool hasDashAudio, required String typeTag, }) : super( videoSource: path.join( @@ -32,7 +33,7 @@ class FileSource extends DataSource { typeTag, isMp4 ? PathUtils.videoNameType1 : PathUtils.videoNameType2, ), - audioSource: isMp4 + audioSource: isMp4 || !hasDashAudio ? null : path.join(dir, typeTag, PathUtils.audioNameType2), ); diff --git a/lib/services/download/download_service.dart b/lib/services/download/download_service.dart index c44a859b8..1d469da0d 100644 --- a/lib/services/download/download_service.dart +++ b/lib/services/download/download_service.dart @@ -138,7 +138,7 @@ class DownloadService extends GetxService { final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000; final entry = BiliDownloadEntryInfo( mediaType: 2, - hasDashAudio: true, + hasDashAudio: false, isCompleted: false, totalBytes: 0, downloadedBytes: 0, @@ -206,7 +206,7 @@ class DownloadService extends GetxService { ); final entry = BiliDownloadEntryInfo( mediaType: 2, - hasDashAudio: true, + hasDashAudio: false, isCompleted: false, totalBytes: 0, downloadedBytes: 0,