By Werner Ruotsalainen on Sun, 05/27/2012
I have some bad news for you iPad 3 owners looking for further enhancing the (otherwise, resolution-wise, excellent (dedicated article)) video camera of the tablet. I've spent at least 6-7 hours today carefully examining and programming the iPad 3 camera to greatly enhance its functionality, just as I've did to the iPhone 3GS (higher-than-VGA resolutions), 4 (much wider Field-of-View) and 4S (720p60; better low-light performance; much wider Field-of-View at lower resolutions).
As I've pointed out in the above article, the iPad 3's camera suffers from the same problem as the iPhone 4 and 4S: mostly, the very narrow field-of-view of the camera (at least in the high-resolution modes: 720p and, where available, 1080p).
Unfortunately, it seems NONE of the hacks can be done on the iPad 3. While I did manage to make the field-of-view as wide as with stills, the resolution suffered badly, making any kind of hacks useless. (It's the best to record to VGA output files with FiLMiC Pro (article) - those files deliver the same effective resolution at the fraction of file size.) This means that, unless something happens (someone else still discovers some way of hacking / enhancing the camera), I don't spend more time on this camera.
For hackers / advanced users only
The following section will be highly technical and only meant to people that aren't afraid of plist editing and, generally, hacking. (You've been warned!)
Actually, even the lack of the keys (or key endings) “binned” or “p60/60p” in the /System/Library/PrivateFrameworks/ MediaToolbox.framework/J2a/ AVCaptureSession.plist file (as opposed to the iPhone 4S) shows the camera sensor's hardware simply doesn't support some modes, including being read out more than 30 times a second. (The sensor of the iPad 3 is the same that was also used in the iPhone 4; that is, it's considerably older than that of the 4S. It's pretty understandable that it doesn't support readouts at 60 frames per second – after all, most not very expensive sensors designed before 2011 also lacked any 60p readout modes.)
OK, let's get back to the business. I've provided the PLIST files I've created in THIS file for you, should you want to (still) give them a try. (Just remember to rename them back to AVCaptureSession.plist before overwriting the one at /System/Library/PrivateFrameworks/ MediaToolbox.framework/J2a/ !) The numbers of the bullets below re exactly the same as those at the beginning of each filename in the ZIP; that is, you'll quickly find the plist file you look for.
The following shot is my test scene for Field-of-View (FoV for short) testing. Just compare the how much the camera has “zoomed in” in the provided (three) stills showing the same in the original, non-hacked state.
(Click the thumbnail for the original, full-resolution and -quality framegrab! Original video HERE)
(Note that with the two hacked case, I've also presented a resolution chart. A video and a framegrab of the default – unhacked – resolution can be found in my previous iPad 3 camera-specific article.)
First, just changing AVCaptureDevices / AVCaptureSessionPresetHigh / LiveSourceOptions / Sensor / Height from 1080 to 1936 and AVCaptureDevices / AVCaptureSessionPresetHigh / LiveSourceOptions / Sensor / Width 1920 to 2592 (the dimensions of the sensor) doesn't work: no wider FoV and unplayable footage.
1. With AVCaptureDevices / AVCaptureSessionPresetHigh / LiveSourceOptions / ImageStabilizationMethod set to 0 (from the default 2), however, I've gained much wider FoV! BUT: 1, it's vertically compressed: it puts a 4:3 image to a 16:9 video footage. The stock player can't play back the file correctly as its single zoom mode keeps the aspect ratio (16:9); however, some third party players can apply non-symmetric zoom. 2, Its resolution is AWFUL.
I provide you with the shot of both the (much wider – it's as wide as a still shot and, therefore, can't be even wider as stills make use of all the pixels on the sensor) and the resolution chart framegrab + video:
2. Trying to create natively 4:3 footage? Capture / Height to 1440 (instead of 1080): unreadable footage. This MUST be related to the fact that the hardware isn't really capable of even playing back H.264 videos that have higher resolution than Full HD (see my dedicated 2K article for more info on this restriction).
3. (continuing with 1.:) reduced vertical pixel usage: instead of 1936, only 1080*2592/1920 = 1458: not any effect! The same as the 1936 case.
4. (continuing with 1.:) Capture / Width to 1440 and Height: 1080 to generate 4:3 movie. Now, the footage is correct, has the widest FoV possible and doesn't require runtime 16:9 -> 4:3 correction. However, its resolution is useless.
(original video; this video has been shot far later than the previous two; this is why it's much darker)
5. Here, I started trying to increase the frame-per-second the camera records: additional MaxFrameRate / MinFrameRate to 60 key/value pairs; no other changes: useless footage.
6, continue with 5, set MinFrameRate to 24, everything else stays: useless
7, continuing with 6, setting ImageStabilizationMethod to 0 (as in 1): OK, works, but 30p only.
8, continuing with 7, set MinFrameRate to 60: works. However, it's 30p only.
9, using H264_Baseline_4_2 instead of H264_Baseline_4_1 under VideoCompressionProperties / ProfileLevel (it's Level 4.2 that starts allowing for 1080p60): doesn't have any effect. Neither has H264_Main_4_2 or H264_High_4_2 or H264_Baseline_5_1.
10, having found out that it's not possible to record 60p video at 1080p (neither is on the iPhone 4S), I started experimenting with the 720p mode - on the 4S, it's possible to record 60p video at 720p. Added the following to a genuine 720p record copied to AVCaptureDevices / AVCaptureSessionPresetHigh / LiveSourceOptions / Sensor / Height from 1080 to 1936 and AVCaptureDevices / AVCaptureSessionPresetHigh:
The results are still 30 fps.
11, in the prev. record, using “H264_Baseline_5_1” instead of H264_Baseline_3_1 (it's Level 3.2 that starts allowing for 720p60; Level 3.1 only allows for 30p): 30p remains.
12, finally, I started playing with enhancing the low-light performance with the “Binned” Boolean in 720p (which works just fine on the 4s): <key>Binned</key><true/> added: no difference at all.