如何合并两个具有透明度的视频

Posted

技术标签:

【中文标题】如何合并两个具有透明度的视频【英文标题】:how to merge two video with transparency 【发布时间】:2017-04-15 17:44:15 【问题描述】:

我已成功合并 video-1 和 video-2,使用 AVFoundation framework 将 video-2 相互叠加,但合并后视频(video-1)不只显示 video- 2 是可见的,但是当我使用下面的代码时

AVMutableVideoCompositionLayerInstruction *SecondlayerInstruction =[AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:secondTrack];
[SecondlayerInstruction setOpacity:0.6 atTime:kCMTimeZero];

它在 video-2 层上设置了不透明度。但这里的实际问题是,video-2 层上有一些不透明的内容,在这里在 video-2 层上应用不透明度后,它也适用于不透明的内容透明。 我在这里添加了两张图片,描述了使用AVMutableVideoCompositionLayerInstruction 设置不透明度后的两种情况@

如合并透明区域后的图像为黑色,当我在整个第二层设置不透明度时,video-2 现在变为透明,但内容也变为透明。 但我的问题是合并后如何在另一个视频上播放透明视频。我已经检查了 video-2 是透明的,因为它可以在 android 平台上正常播放。

Edited-1 : 我还尝试在myVideoCompositionInstruction 上设置背景颜色,这也没有帮助。参考这个老问题 link

Edited-2 : 在 AVVideoComposition.h 中,我找到了

表示合成的背景颜色。纯色 BGRA 颜色 仅支持;图案和其他颜色参考不是 支持将被忽略。如果未指定背景颜色 视频合成器将使用不透明的默认背景颜色 黑色的。如果渲染的像素缓冲区没有 alpha,则 alpha backgroundColor 的值将被忽略。

什么意思,我没听懂。谁能帮忙?

【问题讨论】:

你有解决这个问题的办法吗?我面临同样的问题。我想合并两个具有第二个透明度的视频。但它不起作用。 【参考方案1】:

您可以设置视频的 alpha,而不是不透明度。

说明: Alpha 设置元素及其所有子元素的不透明度值,而opacity 仅设置单个组件的不透明度值。

enter link description here

【讨论】:

或视图的 alpha @ShravyaBoggarapu 没找到你。【参考方案2】:

好问题:

试试这个

var totalTime : CMTime = CMTimeMake(0, 0)

func mergeVideoArray()

let mixComposition = AVMutableComposition()
for videoAsset in arrayVideos 
    let videoTrack = 
        mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, 
                                       preferredTrackID: Int32(kCMPersistentTrackID_Invalid))          
    do 
        if videoAsset == arrayVideos.first 
            atTimeM = kCMTimeZero
         else 
            atTimeM = totalTime // <-- Use the total time for all the videos seen so far.
        
        try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), 
                                       of: videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0], 
                                       at: atTimeM)  
        videoSize = videoTrack.naturalSize
     catch let error as NSError 
        print("error: \(error)")
    
    totalTime += videoAsset.duration // <-- Update the total time for all videos.

...

【讨论】:

以上是关于如何合并两个具有透明度的视频的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 可以播放具有透明度的视频吗?

如何在 react-native 中实现具有透明背景的视频

具有透明背景的 MPMoviePlayerViewController 视频

Gif 图像格式中如何合并透明度

如何基于最大值而不是默认合并创建 mipmap?

将 PNG 转换为具有透明度的 webm 视频