为什么H.264和MPEG-4 HE AAC在iPhone XS/Max上停止工作?

5

关于新硬件的问题

我一直在努力调查,但却没有找到任何提示,说明为什么我的H.264编码视频已经无法在这些新设备上使用了。

背景:原始文件直接从iOS设备发送到S3,由AWS Elastic Transcoder将原始文件编码为更压缩的H.264预设。自昨天以来,一位同事报告所有视频都是“黑色”的,现在由于这些设备的交付正在进行中,我已经得到了确认。在模拟器上无法重现此问题。下面列出了未播放的编码视频的exif数据。

是否有专门了解编解码器的领域专家可以解释一下,为什么新设备无法解码此H.264视频,而iPhoneX及以下的设备却没有问题?

➜  Downloads exiftool 30B3485D-24A3-4B6D-8B27-15B7C11FB864.mp4
ExifTool Version Number         : 11.10
File Name                       : 30B3485D-24A3-4B6D-8B27-15B7C11FB864.mp4
Directory                       : .
File Size                       : 202 kB
File Modification Date/Time     : 2018:09:24 20:35:47-07:00
File Access Date/Time           : 2018:09:24 20:36:02-07:00
File Inode Change Date/Time     : 2018:09:24 20:35:53-07:00
File Permissions                : rw-r--r--
File Type                       : MP4
File Type Extension             : mp4
MIME Type                       : video/mp4
Major Brand                     : MP4  Base Media v1 [IS0 14496-12:2003]
Minor Version                   : 0.2.0
Compatible Brands               : isom, iso2, avc1, mp41
Movie Header Version            : 0
Create Date                     : 0000:00:00 00:00:00
Modify Date                     : 0000:00:00 00:00:00
Time Scale                      : 1000
Duration                        : 4.12 s
Preferred Rate                  : 1
Preferred Volume                : 100.00%
Preview Time                    : 0 s
Preview Duration                : 0 s
Poster Time                     : 0 s
Selection Time                  : 0 s
Selection Duration              : 0 s
Current Time                    : 0 s
Next Track ID                   : 3
Track Header Version            : 0
Track Create Date               : 0000:00:00 00:00:00
Track Modify Date               : 0000:00:00 00:00:00
Track ID                        : 1
Track Duration                  : 4.12 s
Track Layer                     : 0
Track Volume                    : 100.00%
Balance                         : 0
Audio Format                    : mp4a
Audio Channels                  : 2
Audio Bits Per Sample           : 16
Audio Sample Rate               : 48000
Matrix Structure                : 1 0 0 0 1 0 0 0 1
Image Width                     : 320
Image Height                    : 568
Media Header Version            : 0
Media Create Date               : 0000:00:00 00:00:00
Media Modify Date               : 0000:00:00 00:00:00
Media Time Scale                : 15360
Media Duration                  : 4.00 s
Media Language Code             : und
Handler Description             : VideoHandler
Graphics Mode                   : srcCopy
Op Color                        : 0 0 0
Compressor ID                   : avc1
Source Image Width              : 320
Source Image Height             : 568
X Resolution                    : 72
Y Resolution                    : 72
Bit Depth                       : 24
Pixel Aspect Ratio              : 1:1
Video Frame Rate                : 30
Handler Type                    : Metadata
Handler Vendor ID               : Apple
Encoder                         : Lavf57.71.100
Movie Data Size                 : 202178
Movie Data Offset               : 4545
Avg Bitrate                     : 393 kbps
Image Size                      : 320x568
Megapixels                      : 0.182
Rotation                        : 0

你说视频是黑屏的,但是有没有声音在播放? - Dai
很不幸,我目前无法亲自访问这些设备以进行复现。我找到了一个拥有该设备的朋友,并正在进行可通过iMessage快速确认的测试。关于音频的问题,我会进一步深入挖掘。 - Ryan Romanchuk
如果您感到好奇,这是无法从这些新设备播放的资产 https://vout.getspar.com/afe7bd79-4465-4fb6-8f86-d39b26db7002/F0368F15-4962-4377-8FCB-5F2EF0807FEA.mp4。弹性转码器H264预设为`InterlacedMode:Auto,MaxReferenceFrames:3,Level:4.1,ColorSpaceConversionMode:None,Profile:high`。我已经完成了其他的健全性测试,转码HEVC正常播放,原始源在这种情况下使用`AVAssetExportPresetMediumQuality`和`AVAssetExportSession`也可以正常工作。 - Ryan Romanchuk
音频格式为:AAC,配置文件为:HE-AAC,采样率:自动,比特率:40,声道数:自动。这些设备上的播放器可能会出现解码问题,但我很难确定是哪个设置导致的。在我拥有的其他苹果设备上都可以正常工作,包括ios11/12、iphoneSE/X/7/8和ipad pro/mini。我想知道是否与AWS使用的编码器有关。我觉得其他内容提供商现在应该已经开始讨论这个问题了。 - Ryan Romanchuk
这个有更新了吗?我也遇到了类似的问题。 - digitaljerry
显示剩余4条评论
3个回答

2

这个问题在我使用iOS13测试版时自行解决了。苹果公司回复我说,H264头部显示我的视频版本为4.0,但第一个H264帧显示为3.1,而iOS12不允许这种情况。

我通过指定我的头部版本为3.1来在代码中解决了这个问题。


0
我曾经遇到过类似的问题,我的 iPhone XS Max 上出现了黑屏视频。后来发现在创建 AVAssetWriterInputPixelBufferAdaptor 时,我将键 kCVPixelBufferCGImageCompatibilityKeykCVPixelBufferCGBitmapContextCompatibilityKey 设置为 YES,而这似乎导致了问题。从字典中注释掉这两个键似乎解决了问题。

0

我已经找到了原因。IPhone Xs+支持所有H.264分辨率和帧速率。但是,某些帧速率需要HEVC:

  • 1080p @ 240 fps
  • 4K @ 60 fps

因此,如果您不将captureSession.sessionPreset配置为一些自定义的低分辨率值:

if isFullHDVideoEnabled && captureSession.canSetSessionPreset(AVCaptureSession.Preset.hd1920x1080)  {
                    captureSession.sessionPreset = AVCaptureSession.Preset.hd1920x1080
                }
                else {
                    captureSession.sessionPreset = AVCaptureSession.Preset.hd1280x720
                }

iPhone 将以 H.265 捕获视频,并且在 movieFileOutput.availableVideoCodecTypes 中只有一个选项(.hevc)。

                    if #available(iOS 11.0, *) {
                        if movieFileOutput.availableVideoCodecTypes.contains(.h264) {
                            movieFileOutput.setOutputSettings([AVVideoCodecKey: AVVideoCodecType.h264], for: connection)
                        }
                        else if movieFileOutput.availableVideoCodecTypes.contains(.hevc) {
                            movieFileOutput.setOutputSettings([AVVideoCodecKey: AVVideoCodecType.hevc], for: connection)
                        }
                    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接