【问题标题】:play hi-res video (2048x1536) on New iPad retina在新 iPad 视网膜上播放高分辨率视频 (2048x1536)
【发布时间】:2012-09-06 19:32:09
【问题描述】:
我想知道是否有一些方法可以在 iPad 上播放具有视网膜分辨率 (2048x1536) 的视频。
我正在开发一个应用程序,它可以使用 MPMoviePlayerController 全屏播放视频,但无法播放 iPad 视网膜分辨率的视频。
来自文档:
支持的格式 此类播放任何支持的电影或音频文件
在 iOS 中。这包括流式内容和固定长度文件。
对于电影文件,这通常意味着扩展名为 .mov 的文件,
.mp4、.mpv 和 .3gp 并使用以下压缩方式之一
标准:
H.264 Baseline Profile Level 3.0 视频,最高 640 x 480 @ 30 fps。
(基线配置文件不支持 B 帧。)MPEG-4 第 2 部分视频
(Simple Profile) 如果你使用这个类来播放音频文件,它
播放音频时显示带有 QuickTime 徽标的白屏。
对于音频文件,此类支持最高 48 kHz 的 AAC-LC 音频,以及
MP3(MPEG-1 Audio Layer 3)高达 48 kHz,立体声音频。
这不是真的!!!我可以在 iPhone 上播放 H.264 视频 (960x640),在 ipad 上播放 1024x768 视频...
所以:
如何以 iPad 视网膜分辨率播放视频?可能吗?
在没有 MPMoviePlayerController 的情况下,还有其他方法可以在 iOS 应用上播放视频吗?
【问题讨论】:
标签:
ios
ipad
video
mpmovieplayercontroller
retina-display
【解决方案1】:
根据我的测试,可以使用 H264 编码在视网膜 iPad 上播放 2048x1536 的文件。诀窍是手刹(或 FFMPEG)生成带有those settings 的文件。在此页面上,您会发现some 1536p video files 可用于测试此分辨率下的播放。
顺便说一句,我在处理本地视频时建议的一件好事是只嵌入“半视网膜”分辨率的视频。 半视网膜是指 1536x1152。这提供了比非视网膜分辨率更多的信息,因此视频在视网膜 iPad 上更清晰一些。而且它足够小巧,可以在任何比 iPhone 3GS 更早的 iOS 设备上播放。所以您只需为所有设备添加一个视频。
【解决方案2】:
iPad 视网膜能够显示 1080p 视频内容。这种格式与各种分辨率兼容,但最常见的是定义为 1920 x 1080。这也是使用内置相机拍摄的视频的尺寸,因此很明显它可以播放,并且比文档中描述的要大可接受的大小。
我能够使用以下代码验证这一点。创建一个基本的单视图项目并将一个视频文件添加到 Supporting Files 组。
ViewController.h
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface CDTViewController : UIViewController{
MPMoviePlayerController *moviePlayer;
}
-(IBAction) playMovie;
@end
ViewController.m
@implementation CDTViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)playMovie {
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"IMG_3803" ofType:@"MOV"]];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
if ([moviePlayer respondsToSelector:@selector(loadState)]) {
[moviePlayer setControlStyle:MPMovieControlStyleEmbedded];
[moviePlayer setFullscreen:NO];
[moviePlayer prepareToPlay];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerLoadStateDidChange:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
}
}
- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification {
if ([moviePlayer loadState] == MPMovieLoadStateStalled) {
//handle stall
} else if([moviePlayer loadState] != MPMovieLoadStateUnknown) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
[[moviePlayer view] setFrame:self.view.bounds];
[[self view] addSubview:[moviePlayer view]];
[moviePlayer play];
}
}
@end
不要忘记将 MediaPlayer.framework 添加到您的项目中。此示例假定 xib 文件中有一个播放按钮,它的 touchUpInside 事件附加到 playMovie IBAction。