首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS上使用HEVC编码器输出巨大的视频

在iOS上使用HEVC编码器输出巨大的视频
EN

Stack Overflow用户
提问于 2017-10-16 20:17:47
回答 2查看 4.1K关注 0票数 4

我有一个项目,目前使用H.264编码器记录视频在iOS上。我想尝试使用iOS 11中新的HEVC编码器来减少文件大小,但发现使用HEVC编码器会导致文件大小急剧膨胀。这是一个GitHub上的项目,它展示了这个问题--它同时使用H.264和H.265 (HEVC)编码器将帧从摄像机写入文件,并将产生的文件大小打印到控制台。

AVFoundation类的设置如下:

代码语言:javascript
复制
class VideoWriter {
    var avAssetWriterInput: AVAssetWriterInput
    var avAssetWriter: AVassetWriter
    init() {
        if #available(iOS 11.0, *) {
            avAssetWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: [AVVideoCodecKey:AVVideoCodecType.hevc, AVVideoHeightKey:720, AVVideoWidthKey:1280])
        }
        avAssetWriterInput.expectsMediaDataInRealTime = true
        do {
            let url = directory.appendingPathComponent(UUID.init().uuidString.appending(".hevc"))
            avAssetWriter = try AVAssetWriter(url: url, fileType: AVFileType.mp4)
            avAssetWriter.add(avAssetWriterInput)
            avAssetWriter.movieFragmentInterval = kCMTimeInvalid
        } catch {
            fatalError("Could not initialize AVAssetWriter \(error)")
        }
    }
...

然后帧写成这样:

代码语言:javascript
复制
    func write(sampleBuffer buffer: CMSampleBuffer) {
        if avAssetWriter.status == AVAssetWriterStatus.unknown {
            avAssetWriter.startWriting()
            avAssetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(buffer))
         }
        if avAssetWriterInput.isReadyForMoreMediaData {
            avAssetWriterInput.append(buffer)
        }
    }

当他们进入AVCaptureVideoDataOutputSampleBufferDelegate时。按照我录制的质量(720 p或1080 p),HEVC编码视频的文件大小应该是相同H.264编码视频的40-60%,当我在iOS上使用默认的相机应用程序时,我看到了这一点,但是当我使用上面提到的AVAssetWriter (或者在上面链接的项目中)时,我看到HEVC的文件大小大约是H.264的三倍。要么我做错了什么,要么HEVC编码器工作不正常。我是遗漏了什么,还是有办法让HEVC通过AVFoundation工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-01 11:11:12

您是否尝试过指定比特率等?详情如下:

代码语言:javascript
复制
NSUInteger bitrate = 50 * 1024 * 1024;  // 50 Mbps
NSUInteger keyFrameInterval = 30;
NSString *videoProfile = AVVideoProfileLevelH264HighAutoLevel;
NSString *codec = AVVideoCodecH264;
if (@available(iOS 11, *)) {
    videoProfile = (NSString *)kVTProfileLevel_HEVC_Main_AutoLevel;
    codec = AVVideoCodecTypeHEVC;
}

NSDictionary *codecSettings = @{AVVideoAverageBitRateKey: @(bitrate),
                              AVVideoMaxKeyFrameIntervalKey: @(keyFrameInterval),
                              AVVideoProfileLevelKey: videoProfile};
NSDictionary *videoSettings = @{AVVideoCodecKey: codec,
                              AVVideoCompressionPropertiesKey: codecSettings,
                              AVVideoWidthKey: @((NSInteger)resolution.width),
                              AVVideoHeightKey: @((NSInteger)resolution.height)};

AVAssetWriterInput *videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
...

据我所知,在相同的比特率下,H264和HEVC的文件大小应该是相同的,但是HEVC的质量应该更好。

票数 2
EN

Stack Overflow用户

发布于 2019-07-25 18:40:22

使用exportSession.fileLengthLimit = 1048576 * 10 //10 MB

10 is是硬编码数字。根据您所需的比特率使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46778436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档