|
@@ -19,7 +19,7 @@ public class PQCompositionExporter {
|
|
|
public let asset: AVAsset
|
|
|
public let videoComposition: AVVideoComposition?
|
|
|
public let audioMix: AVAudioMix?
|
|
|
- public let filters: [ImageProcessingOperation]?
|
|
|
+ public var filters: [PQBaseFilter]?
|
|
|
public var mStickers:[PQEditVisionTrackMaterialsModel]?
|
|
|
public let animationTool: AVVideoCompositionCoreAnimationTool?
|
|
|
public let exportURL: URL
|
|
@@ -51,7 +51,7 @@ public class PQCompositionExporter {
|
|
|
//是否合成片尾模式
|
|
|
var isEndMovie:Bool = false
|
|
|
|
|
|
- public init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [ImageProcessingOperation]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
|
|
|
+ public init(asset: AVAsset, videoComposition: AVVideoComposition? = nil, audioMix: AVAudioMix? = nil, filters: [PQBaseFilter]? = nil,stickers:[PQEditVisionTrackMaterialsModel]? = nil, animationTool: AVVideoCompositionCoreAnimationTool? = nil, exportURL: URL) {
|
|
|
self.asset = asset
|
|
|
self.videoComposition = videoComposition
|
|
|
self.audioMix = audioMix
|
|
@@ -123,16 +123,30 @@ public class PQCompositionExporter {
|
|
|
}
|
|
|
BFLog(message: "export mShowVidoSize is \(String(describing: input?.mShowVidoSize))")
|
|
|
|
|
|
- let videoEncodingSettings: [String: Any] = [
|
|
|
- AVVideoCompressionPropertiesKey: [
|
|
|
- AVVideoExpectedSourceFrameRateKey: 30,
|
|
|
- AVVideoAverageBitRateKey: videoAverageBitRate == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) * 2 : videoAverageBitRate,
|
|
|
- AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
|
|
|
- AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
|
|
|
- ],
|
|
|
- // AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
|
|
|
- AVVideoCodecKey: AVVideoCodecH264,
|
|
|
- ] // deprecated: 11.0, renamed: "AVVideoCodecType.h264" 改名
|
|
|
+ var videoEncodingSettings: [String: Any] = ["":""]
|
|
|
+ if #available(iOS 11.0, *) {
|
|
|
+ videoEncodingSettings = [
|
|
|
+ AVVideoCompressionPropertiesKey: [
|
|
|
+ AVVideoExpectedSourceFrameRateKey: 30,
|
|
|
+ AVVideoAverageBitRateKey: (videoAverageBitRate / 2) == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) : videoAverageBitRate,
|
|
|
+
|
|
|
+// AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
|
|
|
+ ],
|
|
|
+ // AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
|
|
|
+ AVVideoCodecKey: AVVideoCodecHEVC,
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+// let videoEncodingSettings: [String: Any] = [
|
|
|
+// AVVideoCompressionPropertiesKey: [
|
|
|
+// AVVideoExpectedSourceFrameRateKey: 30,
|
|
|
+// AVVideoAverageBitRateKey: videoAverageBitRate == 0 ? Int(input?.mShowVidoSize.width ?? 0) * Int(input?.mShowVidoSize.height ?? 0) * 2 : videoAverageBitRate,
|
|
|
+// AVVideoProfileLevelKey: AVVideoProfileLevelH264HighAutoLevel,
|
|
|
+// AVVideoH264EntropyModeKey: AVVideoH264EntropyModeCABAC,
|
|
|
+// ],
|
|
|
+// // AVVideoAllowFrameReorderingKey: videoTrack.requiresFrameReordering],
|
|
|
+// AVVideoCodecKey: AVVideoCodecH264,
|
|
|
+// ] // deprecated: 11.0, renamed: "AVVideoCodecType.h264" 改名
|
|
|
|
|
|
do {
|
|
|
try output = MovieOutput(URL: tmpExportURL ?? exportURL, size: Size(width: Float(input?.mShowVidoSize.width ?? 1080), height: Float(input?.mShowVidoSize.height ?? 1080)), fileType: .mp4, liveVideo: false, videoSettings: videoEncodingSettings, videoNaturalTimeScale: 30, audioSettings: audioEncodingSettings, audioSourceFormatHint: nil)
|
|
@@ -147,7 +161,12 @@ public class PQCompositionExporter {
|
|
|
|
|
|
if(mStickers == nil){
|
|
|
var currentTarget: ImageSource = input!
|
|
|
-
|
|
|
+
|
|
|
+ //根据zOrder 进行排序
|
|
|
+ filters?.sort(by: { a, b in
|
|
|
+ a.zOrder < b.zOrder
|
|
|
+ })
|
|
|
+
|
|
|
if filters?.count ?? 0 > 0 {
|
|
|
filters!.forEach {
|
|
|
currentTarget.addTarget($0, atTargetIndex: 0)
|
|
@@ -166,8 +185,7 @@ public class PQCompositionExporter {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- public func findShowStikcer(currTime:Float64) {
|
|
|
+ public func findShowSticker(currTime:Float64) {
|
|
|
|
|
|
if(mStickers?.count ?? 0 == 0){
|
|
|
BFLog(message: "mStickers data is error")
|
|
@@ -182,21 +200,7 @@ public class PQCompositionExporter {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
-// while true {
|
|
|
-//
|
|
|
-// if let sticker = mStickers!.first {
|
|
|
-// if Float(sticker.timelineIn).decimalNumber(5) <= Float(currTime).decimalNumber(5) && Float(sticker.timelineOut).decimalNumber(5) >= Float(currTime).decimalNumber(5) {
|
|
|
-// BFLog(message: " 导出时换了的时间:\(currTime)")
|
|
|
-// currentSticker = sticker
|
|
|
-// break
|
|
|
-// }else{
|
|
|
-// mStickers!.removeFirst()
|
|
|
-// }
|
|
|
-// }else{
|
|
|
-// break
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
+
|
|
|
//创建不同的filter
|
|
|
if(currentSticker == nil){
|
|
|
BFLog(message: "sticker data is error")
|
|
@@ -333,7 +337,7 @@ public class PQCompositionExporter {
|
|
|
input?.progress = { [weak self] currTime, duration, progress in
|
|
|
|
|
|
if(self?.mStickers?.count ?? 0 > 0){
|
|
|
- self?.findShowStikcer(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
|
|
|
+ self?.findShowSticker(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
|
|
|
// self?.changeFilter(currTime: CMTimeGetSeconds(self?.input?.currentTime ?? .zero) )
|
|
|
}
|
|
|
DispatchQueue.main.async {[weak self] in
|