AVAssetExportSession
drop-in replacement with customizable audio&video settings.
You want the ease of use of AVAssetExportSession
but default provided presets doesn't fit your needs? You then began to read documentation for AVAssetWriter
, AVAssetWriterInput
, AVAssetReader
, AVAssetReaderVideoCompositionOutput
, AVAssetReaderAudioMixOutput
… and you went out of aspirin? SDAVAssetExportSession
is a rewrite of AVAssetExportSession
on top of AVAssetReader*
and AVAssetWriter*
. Unlike AVAssetExportSession
, you are not limited to a set of presets – you have full access over audio and video settings.
For ObjC:
SDAVAssetExportSession *encoder = [SDAVAssetExportSession.alloc initWithAsset:anAsset];
encoder.outputFileType = AVFileTypeMPEG4;
encoder.outputURL = outputFileURL;
encoder.videoSettings = @
{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: @1920,
AVVideoHeightKey: @1080,
AVVideoCompressionPropertiesKey: @
{
AVVideoAverageBitRateKey: @6000000,
AVVideoProfileLevelKey: AVVideoProfileLevelH264High40,
},
};
encoder.audioSettings = @
{
AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: @2,
AVSampleRateKey: @44100,
AVEncoderBitRateKey: @128000,
};
[encoder exportAsynchronouslyWithCompletionHandler:^
{
if (encoder.status == AVAssetExportSessionStatusCompleted)
{
NSLog(@"Video export succeeded");
}
else if (encoder.status == AVAssetExportSessionStatusCancelled)
{
NSLog(@"Video export cancelled");
}
else
{
NSLog(@"Video export failed with error: %@ (%d)", encoder.error.localizedDescription, encoder.error.code);
}
}];
And for Swift:
- add the package to your Xcode project (https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app)
- import package
- use it in swift code like
import SPMAssetExporter
// ...
let exporter = SDAVAssetExportSession(asset: asset)!
exporter.outputFileType = processingParameters.outputFileType.rawValue
exporter.outputURL = processingParameters.outputUrl
exporter.videoSettings = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: targetSize.width,
AVVideoHeightKey: targetSize.height,
AVVideoCompressionPropertiesKey: [AVVideoAverageBitRateKey: 1024_000,AVVideoProfileLevelKey: AVVideoProfileLevelH264High40]
]
exporter.audioSettings = [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVNumberOfChannelsKey: 1,
AVSampleRateKey: 44100,
AVEncoderBitRateKey: 96_000
]
exporter.videoComposition = videoComposition
exporter.exportAsynchronously(completionHandler: {
switch encoder.status {
// do your work here
}
})
All source code is licensed under the MIT-License.