{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-304", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/304", "wordCount": 2117, "segments": [{"start": 7.0, "text": "Hi, I am Mohit Setia - I'm an engineer on the Camera Software team."}, {"start": 11.0, "text": "Welcome to: \"Implement high resolution photo capture.\""}, {"start": 15.0, "text": "Advancements in camera hardware and computational photography"}, {"start": 18.0, "text": "make high-resolution captures possible."}, {"start": 21.0, "text": "But taking full advantage of that quality means managing tradeoffs"}, {"start": 26.0, "text": "particularly between processing time and final image quality."}, {"start": 31.0, "text": "I'll go over high-quality photo processing"}, {"start": 34.0, "text": "and how to manage those tradeoffs for your app."}, {"start": 37.0, "text": "First, I will cover different types of high-resolution photos."}, {"start": 42.0, "text": "Then, how to configure and capture them."}, {"start": 46.0, "text": "And finally, I'll discuss how to keep your app responsive throughout the process."}, {"start": 52.0, "text": "First up: high-resolution photos."}, {"start": 55.0, "text": "The preview stream gives you a screen-resolution image,"}, {"start": 59.0, "text": "suitable for showing the camera's view."}, {"start": 62.0, "text": "But in photography use cases higher level of detail and low noise is expected."}, {"start": 69.0, "text": "Also, high resolution image is required for photo cropping,"}, {"start": 74.0, "text": "zooming in on details, or image analysis."}, {"start": 78.0, "text": "High resolution captures address this."}, {"start": 81.0, "text": "Let me define what they are."}, {"start": 83.0, "text": "A high-resolution photo — typically 12 megapixels"}, {"start": 86.0, "text": "captures the scene at a higher resolution than the preview stream."}, {"start": 91.0, "text": "24 megapixels and 48 megapixels takes it a step further."}, {"start": 97.0, "text": "The camera captures it at an even larger resolution."}, {"start": 101.0, "text": "That means significantly more detail and clarity."}, {"start": 106.0, "text": "Starting with iPhone 14 Pro and iPhone 14 Pro Max,"}, {"start": 110.0, "text": "the camera system features of 48 megapixel Quad sensor."}, {"start": 114.0, "text": "A quad-pixel sensor design allows capturing photos at full resolution"}, {"start": 119.0, "text": "with the highest level of details"}, {"start": 122.0, "text": "or group pixels in two by two clusters of the same color to capture more light."}, {"start": 129.0, "text": "This is a 48 megapixel photo captured on an iPhone!"}, {"start": 133.0, "text": "It shows a sweeping coastal landscape"}, {"start": 136.0, "text": "cliffs, beach, and ocean stretching to the horizon."}, {"start": 140.0, "text": "It is four times the resolution of a standard photo,"}, {"start": 145.0, "text": "and it is captured using a single frame from the sensor."}, {"start": 149.0, "text": "Notice the fine rocks on 100% crop of the coast."}, {"start": 154.0, "text": "Clearly visible in incredible detail."}, {"start": 157.0, "text": "And the intricate patterns on the side of the mountain."}, {"start": 162.0, "text": "This is the power of 48 megapixels:"}, {"start": 166.0, "text": "more detail, more clarity, more to explore."}, {"start": 170.0, "text": "Starting with iPhone 15, the camera supports 24 megapixel photos."}, {"start": 176.0, "text": "A 24 megapixel photo capture consists of multiple steps."}, {"start": 181.0, "text": "First, the camera uses combined pixels on the Quad sensor"}, {"start": 185.0, "text": "to generate a 12 megapixel, multi-frame fused, high dynamic range image."}, {"start": 191.0, "text": "Then, the computational image processing pipeline, called photonic engine,"}, {"start": 196.0, "text": "combines that with a high resolution 48MP image"}, {"start": 199.0, "text": "captured at a full sensor resolution for rich details."}, {"start": 204.0, "text": "Resulting in a 24MP image with incredible quality"}, {"start": 208.0, "text": "double the resolution of a 12MP image"}, {"start": 212.0, "text": "with only about 50% increase in the file size."}, {"start": 216.0, "text": "It balances light and detail"}, {"start": 219.0, "text": "while keeping file size manageable for storing and sharing."}, {"start": 224.0, "text": "Starting with iPhone 15, the Camera app defaults to this capture mode."}, {"start": 229.0, "text": "24MP and 48MP capture support has been extended"}, {"start": 234.0, "text": "to the telephoto camera on iPhone 16 Pro, and the ultra wide camera on iPhone 17."}, {"start": 241.0, "text": "So these are the types of high resolution photos available across iPhone cameras."}, {"start": 247.0, "text": "Now that I've defined the high-resolution photos available on iPhone,"}, {"start": 251.0, "text": "here are the types of high resolution captures that you can request in your app."}, {"start": 256.0, "text": "First, the most common case — the fully processed photo."}, {"start": 261.0, "text": "This is a multi-frame fused image."}, {"start": 264.0, "text": "It goes through Photonic Engine,"}, {"start": 266.0, "text": "that extends dynamic range and improves fine details."}, {"start": 271.0, "text": "Second, Exposure brackets"}, {"start": 273.0, "text": "multiple exposure frames of the same scene."}, {"start": 277.0, "text": "This is useful for creating high dynamic range photo capture"}, {"start": 281.0, "text": "and scenarios where a selection from multiple exposures is required."}, {"start": 286.0, "text": "Third, Bayer RAW photos."}, {"start": 288.0, "text": "RAW gives you minimally processed data straight from the sensor."}, {"start": 292.0, "text": "This is ideal for post-processing and editing use cases."}, {"start": 297.0, "text": "And fourth, Apple's ProRAW."}, {"start": 300.0, "text": "ProRAW combines the flexibility of RAW with iPhone's image processing."}, {"start": 306.0, "text": "It gives more flexibility when editing exposure, color, and detail."}, {"start": 312.0, "text": "To learn more about RAW format,"}, {"start": 314.0, "text": "watch \"Capture and process ProRAW images\" from WWDC 2021."}, {"start": 320.0, "text": "Next, let me share"}, {"start": 321.0, "text": "how to configure the capture session for high-resolution photo."}, {"start": 326.0, "text": "I'll start by creating an AVCaptureSession"}, {"start": 330.0, "text": "and then configure the session."}, {"start": 333.0, "text": "Note - only the photo preset supports 24 and 48 megapixel photos."}, {"start": 340.0, "text": "Other presets do not support it."}, {"start": 342.0, "text": "Next, I will pick the right prioritization for my app."}, {"start": 347.0, "text": "A speed capture delivers fastest, with the least processing."}, {"start": 351.0, "text": "A balanced capture gives medium delivery speed and good quality."}, {"start": 356.0, "text": "A quality capture takes the longest, but delivers the best quality."}, {"start": 362.0, "text": "This is covered in more detail in"}, {"start": 364.0, "text": "\"Capture High-Quality Photos Using Video Formats.\" from WWDC 2021."}, {"start": 371.0, "text": "So while configuring the AVCapturePhotoOutput."}, {"start": 374.0, "text": "I'll set maxPhotoQualityPrioritization"}, {"start": 377.0, "text": "to quality for demonstration of a high res capture."}, {"start": 381.0, "text": "This tells the session to prepare resources for all three prioritization levels"}, {"start": 387.0, "text": "speed, balanced, and quality."}, {"start": 390.0, "text": "The availability of some high resolution depends on this setting"}, {"start": 395.0, "text": "and I'll cover that little later in this video."}, {"start": 398.0, "text": "Next, I will select the largest dimensions that I would request in this session."}, {"start": 403.0, "text": "Starting from iOS 16, you can check the supported max photo dimensions"}, {"start": 409.0, "text": "on the active format of the device."}, {"start": 411.0, "text": "supportedMaxPhotoDimensions lists"}, {"start": 414.0, "text": "all possible photo dimensions on the current format."}, {"start": 418.0, "text": "Here, I'm selecting the largest available dimensions for demonstration"}, {"start": 424.0, "text": "but you should pick the dimensions that fit your use case."}, {"start": 428.0, "text": "Complete photo output configuration before committing the session configuration."}, {"start": 434.0, "text": "Changing these settings after commit triggers a lengthy pipeline reconfiguration."}, {"start": 441.0, "text": "When ready to capture,"}, {"start": 443.0, "text": "set maxPhotoDimensions and photoQualityPrioritization on"}, {"start": 447.0, "text": "AVCapturePhotoSettings for the current capture."}, {"start": 451.0, "text": "And then set up the delegate to capture the photo."}, {"start": 455.0, "text": "Setting maxPhotoDimensions is a request, not a guarantee."}, {"start": 460.0, "text": "The system looks at light level, scene, and available processing,"}, {"start": 466.0, "text": "and picks the best path it can."}, {"start": 468.0, "text": "The actual dimensions come back to your delegate inside AVCaptureResolvedSettings,"}, {"start": 474.0, "text": "which also notifies the delegate when the capture is complete."}, {"start": 478.0, "text": "You can customize quality prioritization and maxPhotoDimensions on each capture."}, {"start": 484.0, "text": "That means you can support multiple quality levels"}, {"start": 487.0, "text": "and dimensions in the same session"}, {"start": 490.0, "text": "no lengthy reconfiguration between captures."}, {"start": 494.0, "text": "High resolution captures require specific resource allocations based on"}, {"start": 499.0, "text": "photoQualityPrioritization and maxPhotoDimensions."}, {"start": 504.0, "text": "If the system has not preallocated these resources,"}, {"start": 507.0, "text": "the allocation happens at capture time - which can slow things down."}, {"start": 513.0, "text": "To avoid this slow down, use the method setPreparedPhotoSettingsArray"}, {"start": 518.0, "text": "on AVCapturePhotoOutput to signal how you plan to capture future photos."}, {"start": 525.0, "text": "For example, if the app features of 48 megapixel mode,"}, {"start": 529.0, "text": "call setPreparedPhotoSettingsArray as soon as that mode is activated"}, {"start": 535.0, "text": "so resources are ready before the capture happens."}, {"start": 539.0, "text": "Here is how you can implement this."}, {"start": 541.0, "text": "As early as possible, create a prepareSettings object."}, {"start": 547.0, "text": "Set the appropriate maxPhotoDimensions and photoQualityPrioritization."}, {"start": 552.0, "text": "Then call setPreparedPhotoSettingsArray."}, {"start": 556.0, "text": "Later, when ready to capture,"}, {"start": 559.0, "text": "create a new captureSettings object that matches the prepareSettings configuration."}, {"start": 565.0, "text": "Keep in mind, you cannot reuse the prepareSettings object"}, {"start": 569.0, "text": "for the actual capture."}, {"start": 571.0, "text": "Create a new settings object, but make sure its configuration matches,"}, {"start": 577.0, "text": "so the capture aligns with the preallocated resources."}, {"start": 581.0, "text": "Capturing high resolution photos requires processing of a large number of pixels."}, {"start": 587.0, "text": "This processing can take several seconds."}, {"start": 590.0, "text": "I'll now provide some best practices to ensure"}, {"start": 594.0, "text": "that the app remains fast and responsive during this process."}, {"start": 597.0, "text": "When a photo is requested, it first goes through a capture stage"}, {"start": 602.0, "text": "then moves to a processing stage."}, {"start": 605.0, "text": "AVCapturePhotoCaptureDelegate receives notifications throughout this process."}, {"start": 611.0, "text": "For example, didCapturePhotoFor resolvedSettings"}, {"start": 615.0, "text": "and didFinishCaptureFor resolvedSettings"}, {"start": 618.0, "text": "keep the app up to date as processing continues."}, {"start": 622.0, "text": "Processing can take a different amount of time"}, {"start": 625.0, "text": "based on selected photo quality prioritization."}, {"start": 628.0, "text": "A photo with quality prioritization is delivered with the best image"}, {"start": 633.0, "text": "by utilizing longer processing time."}, {"start": 637.0, "text": "A photo with Balance prioritization delivers optimal quality"}, {"start": 641.0, "text": "with appropriate processing time for common cases."}, {"start": 644.0, "text": "A photo with Speed prioritization is the fastest way to get a photo capture"}, {"start": 650.0, "text": "but without the improved quality that comes with longer processing."}, {"start": 656.0, "text": "You can capture 12 megapixel across all three prioritization levels."}, {"start": 662.0, "text": "48 megapixel images, because they're only a single frame as covered earlier,"}, {"start": 667.0, "text": "are available with either balanced, or quality prioritization."}, {"start": 672.0, "text": "18 megapixel and 24 megapixel are multi-frame fused images"}, {"start": 677.0, "text": "and take longer to process that only quality prioritization allows."}, {"start": 682.0, "text": "The 18 megapixel in this table,"}, {"start": 684.0, "text": "is only available on the Center stage front camera on iPhone 17."}, {"start": 689.0, "text": "To learn more about the Center stage front camera Check out the"}, {"start": 693.0, "text": "\"Support Center Stage front camera in your iOS app\" from WWDC 2026."}, {"start": 700.0, "text": "AVCaptureResolvedSettings has a photoProcessingTimeRange property."}, {"start": 705.0, "text": "It tells you how long to expect before the photo is delivered to your delegate."}, {"start": 711.0, "text": "The next photo can only be captured once the previous photo finishes processing."}, {"start": 717.0, "text": "This delay between the two captures is referred to as shot to shot delay."}, {"start": 723.0, "text": "Enabling responsive capture on AVCapturePhotoOutput"}, {"start": 727.0, "text": "allows overlapping captures."}, {"start": 730.0, "text": "A new capture can begin once the capture stage of the previous photo finishes,"}, {"start": 735.0, "text": "no need to wait for processing."}, {"start": 737.0, "text": "Observe the captureReadiness property on AVCapturePhotoOutput"}, {"start": 741.0, "text": "to know when the next photo can be captured."}, {"start": 744.0, "text": "This reduces the shot to shot delay for the second photo."}, {"start": 747.0, "text": "It helps you avoid missing the moment."}, {"start": 751.0, "text": "But keep in mind, each photo still takes the same processing time as before."}, {"start": 756.0, "text": "To reduce shot-to-shot delay even further on high-quality captures,"}, {"start": 761.0, "text": "adopt deferred photo processing."}, {"start": 763.0, "text": "When you enable deferred processing,"}, {"start": 766.0, "text": "the system delivers a lightly processed proxy photo immediately after capture."}, {"start": 771.0, "text": "You receive it via the didFinishCapturingDeferredPhotoProxy"}, {"start": 776.0, "text": "delegate callback."}, {"start": 777.0, "text": "Final photo processing happens in one of two ways."}, {"start": 781.0, "text": "On demand, when you request the final photo through the photo library,"}, {"start": 786.0, "text": "or in the background, when the system decides that the conditions are favorable,"}, {"start": 791.0, "text": "such as the device being idle."}, {"start": 794.0, "text": "Watch \"Create a More Responsive Camera Experience\" from WWDC23"}, {"start": 800.0, "text": "for deep dive into deferred photo processing."}, {"start": 803.0, "text": "Enabling deferred photo processing significantly improves responsiveness by"}, {"start": 808.0, "text": "reducing the processing time blocking the next capture."}, {"start": 812.0, "text": "This further reduces the shot to shot delay for all the subsequent photos."}, {"start": 817.0, "text": "You can now capture more high quality photos in less time."}, {"start": 822.0, "text": "With this approach, time spent on the processing stage shrinks significantly"}, {"start": 828.0, "text": "while the capture stage remains the same."}, {"start": 832.0, "text": "Deferred processing lets the system take longer to finish processing a photo"}, {"start": 837.0, "text": "without blocking the next capture."}, {"start": 840.0, "text": "And because that work happens in the background,"}, {"start": 843.0, "text": "it doesn't share memory with the capture session."}, {"start": 847.0, "text": "That's what makes multi-frame fusion captures possible,"}, {"start": 850.0, "text": "like 18 and 24 megapixel."}, {"start": 854.0, "text": "To prioritize responsiveness even further,"}, {"start": 857.0, "text": "turn on the fast capture prioritization property on AVCapturePhotoOutput."}, {"start": 862.0, "text": "When you turn on fast capture prioritization on photoOutput,"}, {"start": 866.0, "text": "the system detects when someone takes multiple captures in quick succession."}, {"start": 872.0, "text": "It then adapts the photo quality from the highest quality setting"}, {"start": 877.0, "text": "to a balanced quality setting."}, {"start": 880.0, "text": "So in the photo capture timeline, as someone requests rapid captures,"}, {"start": 885.0, "text": "the system dynamically adjusts photo quality prioritization to balanced."}, {"start": 891.0, "text": "Balanced captures require less time for both capture and processing."}, {"start": 896.0, "text": "The result is a speed boost when rapid captures are happening."}, {"start": 901.0, "text": "Starting with iOS 27 on iPhone 16 and iPhone 17,"}, {"start": 905.0, "text": "the system also processes balanced fast captures later using deferred processing."}, {"start": 912.0, "text": "This further minimizes processing time,"}, {"start": 915.0, "text": "giving a faster capture experience for much longer."}, {"start": 919.0, "text": "To illustrate this,"}, {"start": 921.0, "text": "I am out covering a very intense ball game between camera team members."}, {"start": 925.0, "text": "On screen, a basketball court where the action unfolds."}, {"start": 928.0, "text": "At first I start, without Deferred Processing,"}, {"start": 931.0, "text": "Responsive shutter or Fast capture prioritization."}, {"start": 936.0, "text": "Notice the capture button as I try to take photos of the basketball shot."}, {"start": 942.0, "text": "It keeps spinning while processing the photo,"}, {"start": 945.0, "text": "preventing me from taking another shot."}, {"start": 948.0, "text": "I end up with a single photo of the shot."}, {"start": 951.0, "text": "But I can do better to capture the moment I want,"}, {"start": 955.0, "text": "using the APIs, to manage responsiveness."}, {"start": 958.0, "text": "I enable Deferred Processing, Responsive Shutter and Fast capture for the next shot."}, {"start": 965.0, "text": "This time the capture button stays responsive"}, {"start": 968.0, "text": "while I capture the best moment."}, {"start": 971.0, "text": "As I press the capture button,"}, {"start": 974.0, "text": "AVCaptureSession starts capturing Quality photos."}, {"start": 978.0, "text": "But as I continue,"}, {"start": 979.0, "text": "it detects fast captures and intelligently transitions into Balanced captures."}, {"start": 986.0, "text": "The difference is noticeable:"}, {"start": 988.0, "text": "one blocked capture versus five responsive shots of the same moment."}, {"start": 994.0, "text": "This made for a much more responsive capture experience."}, {"start": 997.0, "text": "In this video, I shared best practices for building a responsive photo capture app"}, {"start": 1003.0, "text": "that captures photos with highest quality and resolution."}, {"start": 1007.0, "text": "If you are building a photo capture app, identify the resolution you want."}, {"start": 1012.0, "text": "Higher resolutions like 24 and 48 megapixels"}, {"start": 1016.0, "text": "give people more detail to crop, zoom, and explore"}, {"start": 1020.0, "text": "but they need more memory and processing time."}, {"start": 1024.0, "text": "Pick the quality prioritization that fits your needs."}, {"start": 1027.0, "text": "Speed, balanced, and quality each trade off delivery time against image fidelity."}, {"start": 1033.0, "text": "Match the level to what your app demands."}, {"start": 1036.0, "text": "And if you need the highest quality captures,"}, {"start": 1039.0, "text": "turn on deferred processing and responsive captures."}, {"start": 1043.0, "text": "Without them, each photo blocks the next"}, {"start": 1047.0, "text": "and people using your app might miss moments they can't get back."}, {"start": 1052.0, "text": "To further optimize your camera app, watch"}, {"start": 1055.0, "text": "\"Build a responsive camera app that launches quickly\" from WWDC 2026."}, {"start": 1061.0, "text": "Build a camera experience that's fast when it needs to be."}, {"start": 1065.0, "text": "And uncompromising on quality when it matters."}, {"start": 1068.0, "text": "Thanks for watching."}]}