9

Tôi là người mới bắt đầu phát triển iOS. Tôi đang phát triển một ứng dụng mà tôi yêu cầu kích thước của một video đang được phát trong MPMoviePlayerController.Lấy kích thước của video theo chương trình trong mục tiêu c

Tôi đang sử dụng thuộc tính naturalSize của MPMoviePlayerController để nhận kích thước của video được phát.

@property(nonatomic, readonly) CGSize naturalSize; 

Nhưng vấn đề là tôi có thể nhận được kích thước tự nhiên chỉ khi Video được phát trong MPMoviePlayerController.

Có cách nào để tôi có thể nhận kích thước của video trước khi được phát trong MPMoviePlayerController hay không.

- EDIT -

Có workaround khác tôi có thể tiếp cận để giải quyết vấn đề này? Hãy giúp tôi.

+0

Ngoài ra còn có thuộc tính 'duration' của' MPMoviePlayerController' – tipycalFlow

+0

@tipycalFlow Có, tôi đã thấy thuộc tính đó, nhưng tôi muốn biết chiều cao và chiều rộng của video sắp được phát trong đối tượng MPMoviePlayerController trước khi nó thực sự được phát. – An1Ba7

Trả lời

7

Cần có thời gian để MPMoviePlayerController tải siêu dữ liệu video, vì vậy bạn nên thêm người nghe và đợi cho tải tự nhiên. Một cái gì đó như thế này:

[[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(movieNaturalSizeAvailable:) 
       name:MPMovieNaturalSizeAvailableNotification 
       object:myMoviePlayer]; 

Và trong movieNaturalSizeAvailable:, myVideoPlayer.naturalSize mang đến cho bạn giá trị mong muốn và sau đó, bạn có thể chơi video.

+1

Cảm ơn! nó hoạt động hoàn hảo! :) – An1Ba7

32

Bạn có thể đọc kích thước của video sử dụng AVURLAssetAVAssetTrack, như thế này:

NSURL *mediaURL; // Your video's URL 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:mediaURL options:nil]; 
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *track = [tracks objectAtIndex:0]; 

Sau đó, sử dụng tài sản naturalSize các 's AVAssetTrack:

CGSize mediaSize = track.naturalSize; 

Lợi ích của việc siêu dữ liệu của video theo cách này là bạn có thể truy cập ngay lập tức mà không phải phát video hoặc chờ video tải.

+0

Nó hoạt động cho tôi. Cảm ơn. –

1

Chỉ nghĩ rằng tôi muốn chia sẻ kinh nghiệm của tôi cho những người tìm thấy trang này.

Kích thước tự nhiên không thực sự là độ phân giải được mã hóa, đó là độ phân giải màn hình. điều này có thể khác với độ phân giải được mã hóa ví dụ: nếu tỷ lệ khung hình pixel = 1 hoặc (phổ biến hơn) có thông tin siêu dữ liệu khẩu độ sạch trong video được mã hóa.

Để có được độ phân giải được mã hóa, cách duy nhất tôi tìm được là giải mã khung hình đầu tiên với AVASsetReaderTrackOutput sau đó kiểm tra bộ đệm pixel kết quả bằng CVPixelBufferGetWidth (hoặc GetHeight) để lấy độ phân giải dữ liệu. nếu bạn sử dụng imageGenerator, bạn nhận được độ phân giải màn hình (và bitmap rgb của độ phân giải màn hình)