Дуэт — объединить 2 видео рядомIOS

Программируем под IOS
Ответить
Гость
 Дуэт — объединить 2 видео рядом

Сообщение Гость »


ПРИМЕЧАНИЕ. Объединяйте видео рядом без потери качества

Я думаю, что это очень важный вопрос. После долгих поисков и поиска в Google не нашел никакого полезного материала по этому вопросу.

Я работаю над проектом, в котором мне нужно ОБЪЕДИНИТЬ видео рядом в один файл.

Я выполнил Объединение видео с помощью AVFoundation. Но проблема в том, что ПЕРВОЕ видео отображается как наложение на ВТОРОЕ видео (не выполняется правильное объединение, как в Приложении SMULE/Приложении караоке или приложении Tiktok) ).

func mergeVideosFilesWithUrl(savedVideoUrl: URL, newVideoUrl: URL, audioUrl:URL) { let savePathUrl : NSURL = NSURL(fileURLWithPath: NSHomeDirectory() + "/Documents/camRecordedVideo.mp4") do { // удаляем старое видео попробуйте FileManager.default.removeItem (по адресу: savePathUrl как URL-адрес) } catch { print(error.localizedDescription) } var mutableVideoComposition: AVMutableVideoComposition = AVMutableVideoComposition() вар mixComposition: AVMutableComposition = AVMutableComposition() пусть aNewVideoAsset : AVAsset = AVAsset(url: newVideoUrl) пусть asavedVideoAsset : AVAsset = AVAsset(url: saveVideoUrl) пусть aNewVideoTrack : AVAssetTrack = aNewVideoAsset.tracks(withMediaType: AVMediaType.video)[0] let aSavedVideoTrack : AVAssetTrack = asavedVideoAsset.tracks(withMediaType: AVMediaType.video)[0] let mutableCompositionNewVideoTrack: AVMutableCompositionTrack = mixComposition.addMutableTrack(withMediaType: AVMediaType.video,eferredTrackID: kCMPersistentTrackID_Invalid)! делать{ попробуйте mutableCompositionNewVideoTrack.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, продолжительность: aNewVideoAsset.duration), of: aNewVideoTrack, at: CMTime.zero) }catch { print("Изменяемая ошибка") } let mutableCompositionSavedVideoTrack: AVMutableCompositionTrack = mixComposition.addMutableTrack(withMediaType: AVMediaType.video,eferredTrackID: kCMPersistentTrackID_Invalid)! делать{ попробуйте mutableCompositionSavedVideoTrack.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, продолжительность: asavedVideoAsset.duration), of: aSavedVideoTrack, at: CMTime.zero) }catch{ print("Изменяемая ошибка") } пусть mainInstruction = AVmutableVideoCompositionInstruction() mainInstruction.timeRange = CMTimeRangeMake(начало: CMTime.zero, длительность: CMTimeMaximum(aNewVideoAsset.duration, asavedVideoAsset.duration)) let newVideoLayerInstruction = AVmutableVideoCompositionLayerInstruction (assetTrack: mutableCompositionNewVideoTrack) let newScale: CGAffineTransform = CGAffineTransform.init(scaleX: 0,7, y: 0,7) let newMove : CGAffineTransform = CGAffineTransform.init(translationX: 230, y: 230) newVideoLayerInstruction.setTransform(newScale.concatenating(newMove), по адресу: CMTime.zero) пусть saveVideoLayerInstruction = AVMutableVideoCompositionLayerInstruction (assetTrack: mutableCompositionSavedVideoTrack) let saveScale: CGAffineTransform = CGAffineTransform.init(scaleX: 1.2, y: 1.5) let saveMove : CGAffineTransform = CGAffineTransform.init(translationX: 0, y: 0) saveVideoLayerInstruction.setTransform(savedScale.concatenating(savedMove), по адресу: CMTime.zero) mainInstruction.layerInstructions = [newVideoLayerInstruction, saveVideoLayerInstruction] mutableVideoComposition.instructions = [mainInstruction] mutableVideoComposition.frameDuration = CMTimeMake (значение: 1, временная шкала: 30) mutableVideoComposition.renderSize = CGSize (ширина: 1240, высота: self.camPreview.frame.height) FinalPath = savePathUrl.absoluteString пусть assetsExport: AVAssetExportSession = AVAssetExportSession (актив: mixComposition, PresetName: AVAssetExportPresetHighestQuality)! assetsExport.videoComposition = mutableVideoComposition assetsExport.outputFileType = AVFileType.mov assetsExport.outputURL = savePathUrl как URL-адрес assetsExport.shouldOptimizeForNetworkUse = true assetsExport.exportAsynchronous { () -> Пустота в переключить assetsExport.status { случай AVAssetExportSession.Status.completed: печать("успех") случай AVAssetExportSession.Status.failed: print("Ошибка \(assetExport.error)") случай AVAssetExportSession.Status.cancelled: print("Отменено \(assetExport.error)") по умолчанию: печать("завершено") } } } И это мой результат
Изображение


И чего я хочу


Изображение


Поскольку я не знаю, как лучше всего сделать ВИДЕО ПАРАЛЛОН/ДУЭТ... На данный момент я использовал AVFoundation. Я не использовал никаких сторонних фреймворков или POD.

Я хотел бы спросить, какой подход ЛУЧШИЙ для реализации этого? Видео должны объединяться на стороне сервера или в приложении? И какой подход мне следует использовать?

Любая помощь будет очень признательна. Спасибо
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»