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?
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