2017-10-16 2 views
3

Ich habe ein Projekt, das derzeit den H.264-Encoder verwendet, um Video auf iOS aufzunehmen. Ich wollte versuchen, den neuen HEVC-Encoder in iOS 11 zu verwenden, um die Dateigrößen zu reduzieren, aber ich habe festgestellt, dass die Verwendung des HEVC-Encoders die Dateigröße enorm ansteigen lässt. Here's a project on GitHub that shows the issue - it simultaneously writes frames from the camera to files using the H.264 and H.265 (HEVC) encoders, and the resulting file sizes are printed to the console.Output Video Size Enorme Verwendung HEVC Encoder auf iOS

Die AVFoundation Klassen sind Setup wie folgt aus:

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)") 
     } 
    } 
... 

und dann Frames werden wie folgt geschrieben:

func write(sampleBuffer buffer: CMSampleBuffer) { 
     if avAssetWriter.status == AVAssetWriterStatus.unknown { 
      avAssetWriter.startWriting() 
      avAssetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(buffer)) 
     } 
     if avAssetWriterInput.isReadyForMoreMediaData { 
      avAssetWriterInput.append(buffer) 
     } 
    } 

, wie sie in die AVCaptureVideoDataOutputSampleBufferDelegate kommen. Bei den Qualitäten, die ich aufnehme (720p oder 1080p) sollte die Dateigröße eines HEVC-kodierten Videos 40-60% eines identischen H.264-kodierten Videos betragen, und das sehe ich, wenn ich die Standard-Kamera-App anwende iOS, aber wenn ich AVAssetWriter wie oben (oder in dem oben verlinkten Projekt) verwende, sehe ich, dass die Dateigröße bei HEVC etwa dreimal größer ist als bei H.264. Entweder mache ich etwas falsch oder der HEVC-Encoder funktioniert nicht richtig. Fehle ich etwas oder gibt es einen Workaround, um HEVC durch AVFoundation arbeiten zu lassen?

Antwort

1

Haben Sie versucht, die Bitrate usw. anzugeben? Wie unten:

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]; 
... 

Soweit ich verstehe, mit der gleichen Bitrate, die Dateigröße das gleiche für H264 und HEVC sein sollte, aber die Qualität des HEVC sollte besser sein.

+0

Ich bekam eine ähnliche Antwort von Apple. Offenbar ist die Standardbitrate für H.264 5mbit und HEVC ist 30mbit. Ich melde mich zurück und akzeptiere deine Antwort, wenn ich es ausprobiere und es funktioniert! – jpetrichsr