为什么 H.264、MPEG-4 HE AAC 在 iphoneXS/Max 上停止工作?
Why did H.264, MPEG-4 HE AAC stop working on iphoneXS/Max?
关于新硬件的问题
我一直在疯狂地调查,但没有找到任何线索来说明为什么我的 H.264 编码视频在这些新设备上停止工作。
上下文:直接从 ios 设备,将原件发送到 s3,然后 aws elastic 转码器将原件编码为更压缩的 H.264 预设。截至昨天,一位同事报告说所有视频都是 "black",现在由于这些设备上的交付已经完成,我已经得到确认。无法在模拟器上重现此问题。未播放的编码视频,我在下面列出了 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
我在 iPhone XS Max 上遇到了与此类似的黑色视频问题,事实证明我在 kCVPixelBufferCGImageCompatibilityKey
和 kCVPixelBufferCGBitmapContextCompatibilityKey
中将 kCVPixelBufferCGBitmapContextCompatibilityKey
键设置为 YES =12=] 字典时创建 AVAssetWriterInputPixelBufferAdaptor
。从字典中注释掉这两个键似乎解决了这个问题。
此错误在 iOS13 测试版中自行解决。 Apple 回复我并告诉我 H264 header 说我的视频是 4.0 版,但第一个 H264 帧说它是 3.1,iOS12 不允许。
通过将我的 header 版本指定为 3.1
,我能够在代码中修复此问题
我找到原因了。 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)
}
}
关于新硬件的问题
我一直在疯狂地调查,但没有找到任何线索来说明为什么我的 H.264 编码视频在这些新设备上停止工作。
上下文:直接从 ios 设备,将原件发送到 s3,然后 aws elastic 转码器将原件编码为更压缩的 H.264 预设。截至昨天,一位同事报告说所有视频都是 "black",现在由于这些设备上的交付已经完成,我已经得到确认。无法在模拟器上重现此问题。未播放的编码视频,我在下面列出了 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
我在 iPhone XS Max 上遇到了与此类似的黑色视频问题,事实证明我在 kCVPixelBufferCGImageCompatibilityKey
和 kCVPixelBufferCGBitmapContextCompatibilityKey
中将 kCVPixelBufferCGBitmapContextCompatibilityKey
键设置为 YES =12=] 字典时创建 AVAssetWriterInputPixelBufferAdaptor
。从字典中注释掉这两个键似乎解决了这个问题。
此错误在 iOS13 测试版中自行解决。 Apple 回复我并告诉我 H264 header 说我的视频是 4.0 版,但第一个 H264 帧说它是 3.1,iOS12 不允许。
通过将我的 header 版本指定为 3.1
,我能够在代码中修复此问题我找到原因了。 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)
}
}