A AVAssetExportSession drop-in replacement with customizable audio&video settings.
You can get more control on video encode and decode, see the detail on ExportConfiguration.swift
class ExportConfiguration {
var outputURL = URL.temporaryExportURL()
var fileType: AVFileType = .mp4
var shouldOptimizeFor网络Use = false
var metadata: [AVMetadataItem] = []
}
class VideoConfiguration {
// Video settings see AVVideo设置.h
var videoInputSetting: [String: Any]?
var videoOutputSetting: [String: Any]?
var videoComposition: AVVideoComposition?
}
class AudioConfiguration {
// Audio settings see AVAudio设置.h
var audioInputSetting: [String: Any]?
var audioOutputSetting: [String: Any]?
var audioMix: AVAudioMix?
var audioTimePitchAlgorithm: AVAudioTimePitchAlgorithm?
}exportSession.videoConfiguration.videoOutputSetting = {
let frameRate = 30
let bitrate = min(2000000, videoTrack.estimatedDataRate)
let trackDimensions = videoTrack.naturalSize
let compression设置: [String: Any] = [
AVVideoAverageNonDroppableFrameRateKey: frameRate,
AVVideoAverageBitRateKey: bitrate,
AVVideoMaxKeyFrameIntervalKey: 30,
AVVideo个人资料LevelKey: AVVideo个人资料LevelH264HighAutoLevel
]
var video设置: [String : Any] = [
AVVideoWidthKey: trackDimensions.width,
AVVideoHeightKey: trackDimensions.height,
AVVideoCompressionPropertiesKey: compression设置
]
if #available(iOS 11.0, *) {
video设置[AVVideoCodecKey] = AVVideoCodecType.h264
} else {
video设置[AVVideoCodecKey] = AVVideoCodecH264
}
return video设置
}()
exportSession.audioConfiguration.audioOutputSetting = {
var stereoChannelLayout = AudioChannelLayout()
memset(&stereoChannelLayout, 0, MemoryLayout<AudioChannelLayout>.size)
stereoChannelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo
let channelLayoutAsData = Data(bytes: &stereoChannelLayout, count: MemoryLayout<AudioChannelLayout>.size)
let compressionAudio设置: [String: Any] = [
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVEncoderBitRateKey: 128000,
AVSampleRateKey: 44100,
AVChannelLayoutKey: channelLayoutAsData,
AVNumberOfChannelsKey: 2
]
return compressionAudio设置
}()
VIExportSession only support Swift 4
Cocoapods
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
# your other pod
# ...
pod 'VIExportSession'
end
Manually
You can simplely drag VIExportSession.swift to you project
Under MIT