[英]How to merge multiple videos side by side swift 4
我正在嘗試將多個視頻合並到一個同時播放的視頻中。 我的第一個問題是,在服務器或用戶電話上進行合並更好嗎? 以及如何快速合並視頻? 我試圖通過谷歌搜索找到解決方案,但很快就找不到任何解決方案。 任何幫助,將不勝感激
最好在服務器或用戶的電話上進行合並?
這取決於,真的。 服務器通常很昂貴,但是它們在支持方面給您帶來了更多的靈活性,而且您只需要創建一次功能,而不是每個平台一次。 如果可能,我會一直在設備上進行操作。 因此,就您而言,“設備”似乎是必經之路。
如何在Swift上合並視頻? 我試圖通過谷歌搜索找到解決方案,但是我在Swift上找不到任何解決方案。
Swift本身將無法執行您要求的操作。 您將需要允許此類事情的工具/框架。 您可以在iOS上找到它們。
首先,您應該嘗試指定要執行的操作。 單個視頻(在大多數情況下)包含視頻和音頻軌道。 從標題中我可以推斷出視頻軌道應該並排放置,而沒有關於音頻的信息。 此外,還有一個問題是如何對不具有相同視頻分辨率的視頻進行“並排”。 有幾種可能性。 還有一個問題是,如果不是所有視頻的長度都相同,會發生什么?
在您的情況下,視頻部分可能應該歸結為一定幀速率的圖像。 對於應該在給定時間為每個視頻獲取UIImage
iOS,將圖像縫合在一起,然后將新圖像插入縫合的視頻文件中。 因此,您要尋找的是:
當然,您仍然需要決定選擇哪種輸出視頻。 如何處理不同大小的視頻,以及如何處理不同長度的視頻。 但這只是決定,可以在UIImage
級別上完成。
您將需要確定要使用的幀速率。 我猜沒有理由不只使用固定的30FPS,這意味着您要迭代CMTimeMake(i, 30)
,其中i
在[0, videoDuration*30]
范圍內。
剩下的唯一一件事是音頻部分,您可能會在這里找到一些線索。
因此,總體高級代碼應類似於:
func mergeVideos(urls: [URL]) -> URL {
let overallSize: CGSize = sizeForStichedVideos(urls: urls)
let overallDuration: TimeInterval = longestVideoFrom(urls: urls)
let frameRate: Int = decideFrameRateForVideos(urls: urls)
let stichedVideo: VideoObject = VideoObject(size: overallSize, duration: overallDuration, frameRate: frameRate)
for frameIndex in 0..<Int(ceil(overallDuration))*frameRate {
let time = CMTime(value: frameIndex, timescale: frameRate)
let images: [UIImage?] = imagesFromVideos(urls: urls, at: time)
let stichedImage: UIImage = stitchImages(images)
stichedVideo.appendVideoSample(withImage: stichedImage, at: time)
// TODO: append audio samples
}
stichedVideo.finalize()
return stichedVideo.outputURL
}
玩得開心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.