kingslay / KSPlayer

A video player for iOS、macOS、tvOS、visionOS , based on AVPlayer and FFmpeg, support the horizontal, vertical screen. support adjust volume, brightness and seek by slide, support subtitles.
GNU General Public License v3.0
886 stars 184 forks source link

请问如何支持透明视频呢? #664

Closed birdmichael closed 7 months ago

birdmichael commented 7 months ago

类似这种https://smartprogram.baidu.com/docs/design/resource/animationVideo/#%E9%80%8F%E6%98%8E%E8%A7%86%E9%A2%91%E8%AE%BE%E8%AE%A1%E8%B5%84%E6%BA%90%E7%A4%BA%E4%BE%8B

有办法支持吗?

birdmichael commented 7 months ago

应该是 DisplayEnum 加一个?

kingslay commented 7 months ago

iina或vlc支持吗?

birdmichael commented 7 months ago

不支持... 一般播放器应该都不支持... 主要如果可以这样,这个库就可以拿来播动画了..无敌

kingslay commented 7 months ago

这个直接用透明的gif动图,可以实现吗?如果可以实现的话,那不是会更简单吗?

birdmichael commented 7 months ago

gif和png序列播放起来都有点丢针

birdmichael commented 7 months ago

我发现我有点严重依赖你这个项目了~~哈哈我有3个项目都在用这个库

kingslay commented 7 months ago

那你可以发一下有透明度的视频给我下。你刚发的 afx_16s.mp4 好像是没有透明度的

birdmichael commented 7 months ago

他不是透明度... 他是左边是mask区域,右边是资源区域... 你可以看下这个 https://smartprogram.baidu.com/docs/design/resource/animationVideo/#%E9%80%8F%E6%98%8E%E8%A7%86%E9%A2%91%E8%AE%BE%E8%AE%A1%E8%B5%84%E6%BA%90%E7%A4%BA%E4%BE%8B

birdmichael commented 7 months ago

我在改DisplayModel 一直没实现😄

birdmichael commented 7 months ago

https://www.jianshu.com/p/3a0512e2706f 这个对你有没有帮助

kingslay commented 7 months ago

那这个不好实现。视频格式是支持rgba的。如果能够导出一个rgba的视频的话,那我理解这个视频就是支持透明的了。你这个是相当于要对原视频进行修改变成另外一个视频,视频的宽高都完全不一样了。这个属于视频编辑合成了。不知道是否有这样的filter。

birdmichael commented 7 months ago

https://github.com/lvpengwei/AlphaVideoiOS 这个是现成的

birdmichael commented 7 months ago
private func setupPlayerItem() {
        guard let playerItem = playerItem else { return }
        let tracks = playerItem.asset.tracks
        guard tracks.count > 0 else {
            print("no tracks")
            return
        }
        let videoSize = CGSize(width: tracks[0].naturalSize.width * 0.5, height: tracks[0].naturalSize.height)
        guard videoSize.width > 0 && videoSize.height > 0 else {
            print("video size is zero")
            return
        }
        let composition = AVMutableVideoComposition(asset: playerItem.asset, applyingCIFiltersWithHandler: { request in
            let sourceRect = CGRect(origin: .zero, size: videoSize)
            let alphaRect = sourceRect.offsetBy(dx: sourceRect.width, dy: 0)
            let filter = AlphaFrameFilter()
            filter.inputImage = request.sourceImage.cropped(to: alphaRect)
                .transformed(by: CGAffineTransform(translationX: -sourceRect.width, y:0))
            filter.maskImage = request.sourceImage.cropped(to: sourceRect)
            return request.finish(with: filter.outputImage!, context: nil)
        })

        composition.renderSize = videoSize
        playerItem.videoComposition = composition
        playerItem.seekingWaitsForVideoCompositionRendering = true
    }

改一下 就支持水平的了 这个方便移植到ksplayer吗?

kingslay commented 7 months ago

看了下,这个是用AVPlayer来进行播放的。我的项目里面有KSAVPlayer。这个比较少维护了。你可以对KSAVPlayer进行修改下,让他支持 filter。这样应该就可以了

birdmichael commented 7 months ago

我就是打算用KSMEPlayer.. 不然里面好几个播放器 不好控制

birdmichael commented 7 months ago

而且他这个应该在Metal 就是DisplayModel部分,小改一下就实现了 只是我不知道咋怎么搞

kingslay commented 7 months ago

好的,我尝试下

kingslay commented 7 months ago

感觉思路应该是在Shaders.metal 里面增加一个新的displayTexture。应该就可以了。