From a53b70d5ab65a88a907c19b979ebe94e5c060adc Mon Sep 17 00:00:00 2001 From: Raju M <24muliyashiya@gmail.com> Date: Wed, 3 Dec 2025 14:54:08 +0530 Subject: [PATCH 1/3] [video_player_avfoundation] Fix deprecated tracksWithMediaType usage --- .../video_player_avfoundation/CHANGELOG.md | 7 +- .../FVPVideoPlayer.m | 70 ++++++++++++------- .../video_player_avfoundation/pubspec.yaml | 2 +- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index 7f509fcc462..4caaeaa271b 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,4 +1,9 @@ -## 2.8.8 +## 2.8.8+1 + +* Resolve `tracksWithMediaType:` deprecations. +* Use `loadTracksWithMediaType:completionHandler:` for iOS 15.0+/macOS 12.0+. + +* ## 2.8.8 * Refactors Dart internals for maintainability. diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m index 9da957fbc8c..62843091b4d 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m @@ -82,32 +82,52 @@ - (instancetype)initWithPlayerItem:(AVPlayerItem *)item AVAsset *asset = [item asset]; void (^assetCompletionHandler)(void) = ^{ if ([asset statusOfValueForKey:@"tracks" error:nil] == AVKeyValueStatusLoaded) { - NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; - if ([tracks count] > 0) { - AVAssetTrack *videoTrack = tracks[0]; - void (^trackCompletionHandler)(void) = ^{ - if (self->_disposed) return; - if ([videoTrack statusOfValueForKey:@"preferredTransform" - error:nil] == AVKeyValueStatusLoaded) { - // Rotate the video by using a videoComposition and the preferredTransform - self->_preferredTransform = FVPGetStandardizedTransformForTrack(videoTrack); - // Do not use video composition when it is not needed. - if (CGAffineTransformIsIdentity(self->_preferredTransform)) { - return; + void (^processVideoTracks)(NSArray *) = ^(NSArray *tracks) { + if ([tracks count] > 0) { + AVAssetTrack *videoTrack = tracks[0]; + void (^trackCompletionHandler)(void) = ^{ + if (self->_disposed) return; + if ([videoTrack statusOfValueForKey:@"preferredTransform" + error:nil] == AVKeyValueStatusLoaded) { + // Rotate the video by using a videoComposition and the preferredTransform + self->_preferredTransform = FVPGetStandardizedTransformForTrack(videoTrack); + // Do not use video composition when it is not needed. + if (CGAffineTransformIsIdentity(self->_preferredTransform)) { + return; + } + // Note: + // https://developer.apple.com/documentation/avfoundation/avplayeritem/1388818-videocomposition + // Video composition can only be used with file-based media and is not supported for + // use with media served using HTTP Live Streaming. + AVMutableVideoComposition *videoComposition = + [self getVideoCompositionWithTransform:self->_preferredTransform + withAsset:asset + withVideoTrack:videoTrack]; + item.videoComposition = videoComposition; } - // Note: - // https://developer.apple.com/documentation/avfoundation/avplayeritem/1388818-videocomposition - // Video composition can only be used with file-based media and is not supported for - // use with media served using HTTP Live Streaming. - AVMutableVideoComposition *videoComposition = - [self getVideoCompositionWithTransform:self->_preferredTransform - withAsset:asset - withVideoTrack:videoTrack]; - item.videoComposition = videoComposition; - } - }; - [videoTrack loadValuesAsynchronouslyForKeys:@[ @"preferredTransform" ] - completionHandler:trackCompletionHandler]; + }; + [videoTrack loadValuesAsynchronouslyForKeys:@[ @"preferredTransform" ] + completionHandler:trackCompletionHandler]; + } + }; + + // Use the new async API on iOS 15.0+/macOS 12.0+, fall back to deprecated API on older + // versions + if (@available(iOS 15.0, macOS 12.0, *)) { + [asset loadTracksWithMediaType:AVMediaTypeVideo + completionHandler:^(NSArray *_Nullable tracks, + NSError *_Nullable error) { + if (error == nil && tracks != nil) { + processVideoTracks(tracks); + } + }]; + } else { + // For older OS versions, use the deprecated API with warning suppression +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; +#pragma clang diagnostic pop + processVideoTracks(tracks); } } }; diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index 9c326136d92..fe743bdf754 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avfoundation description: iOS and macOS implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.8.8 +version: 2.8.8+1 environment: sdk: ^3.9.0 From baaccce2c2dde369d0cb1784faf5b310657f3362 Mon Sep 17 00:00:00 2001 From: Raju M <24muliyashiya@gmail.com> Date: Wed, 3 Dec 2025 15:19:16 +0530 Subject: [PATCH 2/3] update CHANGELOG.md and address gemini comment --- packages/video_player/video_player_avfoundation/CHANGELOG.md | 2 +- .../Sources/video_player_avfoundation/FVPVideoPlayer.m | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index 4caaeaa271b..57109b12043 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -3,7 +3,7 @@ * Resolve `tracksWithMediaType:` deprecations. * Use `loadTracksWithMediaType:completionHandler:` for iOS 15.0+/macOS 12.0+. -* ## 2.8.8 +## 2.8.8 * Refactors Dart internals for maintainability. diff --git a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m index 62843091b4d..3c45daec018 100644 --- a/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m +++ b/packages/video_player/video_player_avfoundation/darwin/video_player_avfoundation/Sources/video_player_avfoundation/FVPVideoPlayer.m @@ -82,7 +82,7 @@ - (instancetype)initWithPlayerItem:(AVPlayerItem *)item AVAsset *asset = [item asset]; void (^assetCompletionHandler)(void) = ^{ if ([asset statusOfValueForKey:@"tracks" error:nil] == AVKeyValueStatusLoaded) { - void (^processVideoTracks)(NSArray *) = ^(NSArray *tracks) { + void (^processVideoTracks)(NSArray *) = ^(NSArray *tracks) { if ([tracks count] > 0) { AVAssetTrack *videoTrack = tracks[0]; void (^trackCompletionHandler)(void) = ^{ @@ -119,6 +119,8 @@ - (instancetype)initWithPlayerItem:(AVPlayerItem *)item NSError *_Nullable error) { if (error == nil && tracks != nil) { processVideoTracks(tracks); + } else if (error != nil) { + NSLog(@"Error loading tracks: %@", error); } }]; } else { From aafbb05b80b78fee022113cfd03a7c68e15fbe6a Mon Sep 17 00:00:00 2001 From: Raju M <24muliyashiya@gmail.com> Date: Wed, 3 Dec 2025 15:50:09 +0530 Subject: [PATCH 3/3] version bump --- packages/video_player/video_player_avfoundation/CHANGELOG.md | 2 +- packages/video_player/video_player_avfoundation/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index 57109b12043..593df056f9c 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.8.8+1 +## 2.8.9 * Resolve `tracksWithMediaType:` deprecations. * Use `loadTracksWithMediaType:completionHandler:` for iOS 15.0+/macOS 12.0+. diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index fe743bdf754..532cc426ecd 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avfoundation description: iOS and macOS implementation of the video_player plugin. repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.8.8+1 +version: 2.8.9 environment: sdk: ^3.9.0