5

关于新硬件的问题

我一直在疯狂地调查,并没有找到任何线索说明我的 H.264 编码视频为何停止在这些新设备上运行。

上下文:直接从 ios 设备,原件被发送到 s3,aws 弹性转码器然后将原件编码成更压缩的 H.264 预设。截至昨天,一位同事报告所有视频都是“黑色”的,现在由于这些设备上的交付正在完成,我已经得到确认。无法在模拟器上重现此问题。未播放的编码视频,我在下面列出了 exif 数据。

是否有任何人在编解码器领域具有专业知识,您能否权衡为什么当 iphoneX 及以下设备没有问题时新设备无法解码此 H.264 视频?

➜  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
4

3 回答 3

2

这个错误在 iOS13 beta 版本中为我解决了。Apple 回复我并通知我 H264 标头说我的视频是 4.0 版,但第一个 H264 帧说它是 3.1,iOS12 不允许这样做。

我可以通过将我的标头版本指定为 3.1 在代码中解决此问题

于 2019-06-17T21:54:40.927 回答
0

kCVPixelBufferCGImageCompatibilityKey我在 iPhone XS Max 上遇到了与黑色视频类似的问题,事实证明我kCVPixelBufferCGBitmapContextCompatibilityKeysourcePixelBufferAttributes创建AVAssetWriterInputPixelBufferAdaptor. 从字典中注释掉这两个键似乎已经解决了这个问题。

于 2019-05-09T18:42:36.813 回答
0

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

  • 1080p @ 240 fps
  • 4K @ 60 帧/秒

因此,如果您不将 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)
                        }
                    }

于 2020-01-03T10:37:00.573 回答