首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从目标C中未显示的视频生成视频缩略图

如何从目标C中未显示的视频生成视频缩略图
EN

Stack Overflow用户
提问于 2016-10-05 09:33:08
回答 1查看 757关注 0票数 1

对于objective中的iOS项目,我需要显示没有显示在屏幕上的rtsp视频流的缩略图(我不能截图)。我的视图显示一个视频流和其他流的三个缩略图(定期刷新),这样用户就可以在它们之间切换。

那么,我如何生成这个缩略图呢?我使用MobileVLCKit显示我的主要视频流(我更愿意使用这个框架来生成我的缩略图.如果可能的话)。

我在论坛和谷歌的结果中发现了很多结果,但没有一个结果与我的情况相匹配:流+不显示视频。

谢谢你的帮忙!

编辑:

我也试过VLC的拇指钉,但没有成功:

代码语言:javascript
复制
VLCMedia *media = [VLCMedia mediaWithURL:[NSURL URLWithString:<Rtsp Url>]];
thumbnailer = [VLCMediaThumbnailer thumbnailerWithMedia:media andDelegate:self];

但我总是采用mediaThumbnailerDidTimeOut委托方法。

EN

回答 1

Stack Overflow用户

发布于 2021-09-15 15:29:38

基本上,您需要做的就是使用VLCKit 'VLCMediaThumbnailer‘类并实现'VLCMediaThumbnailerDelegate’所需的两个函数。

下面是一个目标-C示例

代码语言:javascript
复制
@implementation DummyObject <VLCMediaThumbnailerDelegate>

- (void)workerMethod
{
    NSURL *url = [NSURL urlWithString:@""];
    VLCMedia *media = [VLCMedia mediaWithURL:url];

    VLCMediaThumbnailer *thumbnailer = [VLCMediaThumbnailer thumbnailerWithMedia:media delegate:self];

    CGSize thumbSize = CGSizeMake(800.,600.);
    thumbnailer.thumbnailWidth = thumbSize.width;
    thumbnailer.thumbnailHeight = thumbSize.height;

    [thumbnailer fetchThumbnail];
}

- (void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail
{
    if (thumbnail) {
        UIImage *thumbnailImage = [UIImage imageWithCGImage:thumbnail scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
        if (thumbnailImage) {
            // do something with the thumbnail
        }
    }
}

- (void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailer
{
     // show error generating thumbnail
}

@end

目标-C代码的学分

这就是它在 SwiftUI中的样子。

代码语言:javascript
复制
func generateThumbnails()
{
    if mediaPlayer.media != nil
    {
        let vlcMediaThumbnailer: VLCMediaThumbnailer = VLCMediaThumbnailer(media: mediaPlayer.media, andDelegate: self)
        vlcMediaThumbnailer.thumbnailWidth = 440
        vlcMediaThumbnailer.thumbnailHeight = 225
        vlcMediaThumbnailer.snapshotPosition = 0.5 // get thumbs from the middle of the video

        vlcMediaThumbnailer.fetchThumbnail()
    }
}

func mediaThumbnailerDidTimeOut(_ mediaThumbnailer: VLCMediaThumbnailer!)
{
    print("failed generating thumbnail")
}

func mediaThumbnailer(_ mediaThumbnailer: VLCMediaThumbnailer!, didFinishThumbnail thumbnail: CGImage!)
{
    print("got another thumbnail - do something with it")
}

这是一个完整的工作演示 on tvOS 14.7和苹果电视在SwiftUI缩略图在VLCKit

代码语言:javascript
复制
import SwiftUI
import AVFoundation

class VideoModel: ObservableObject
{
    @Published var thumbnails: [Image] = []
    var videoUrl: String = ""
    let thumbnailWidth: CGFloat = 400.0
    let thumbnailHeight: CGFloat = 225.0
}

struct VLCPlayerTestView: View
{
    @State var isPlayVideo: Bool = false
    
    let videoUrl: String = "https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c0/Big_Buck_Bunny_4K.webm/Big_Buck_Bunny_4K.webm.480p.vp9.webm"
    var videoPlayer: VideoPlayer? = nil
    @ObservedObject var videoModel = VideoModel()
    
    init()
    {
        videoModel.videoUrl = videoUrl
        videoPlayer = VideoPlayer(videoModel: videoModel)
    }
    
    var body: some View
    {
        HStack(spacing: 20)
        {
            ForEach(0..<videoModel.thumbnails.count, id: \.self) { itemIndex in
                videoModel.thumbnails[itemIndex]
                    .resizable()
                    .aspectRatio(contentMode: .fill)
                    .frame(width: videoModel.thumbnailWidth, height: videoModel.thumbnailHeight, alignment: Alignment.center)
                    .focusable()
                    .onLongPressGesture(minimumDuration: 0.01) {
                        isPlayVideo = true
                    }
            }
        }
        .fullScreenCover(isPresented: $isPlayVideo)
        {
            videoPlayer
                .edgesIgnoringSafeArea(.all)
                .onAppear {
                    videoPlayer!.player.playVideo()
                }
                .onDisappear {
                    videoPlayer!.player.stopVideo()
                }
        }
    }
}

struct VideoPlayer: UIViewRepresentable
{
    var player: VLCPlayerView
    
    init(videoModel: VideoModel)
    {
        player = VLCPlayerView()
        player.videoModel = videoModel
        player.loadMedia()
        player.generateThumbnails()
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<VideoPlayer>)
    {
    }

    func makeUIView(context: Context) -> UIView
    {
        return player
    }
}




class VLCPlayerView: UIView, VLCMediaPlayerDelegate, VLCMediaThumbnailerDelegate
{
    var videoModel: VideoModel?
    let mediaPlayer: VLCMediaPlayer = VLCMediaPlayer()

    override init(frame: CGRect)
    {
        super.init(frame: frame)
    }
    
    func loadMedia()
    {
        if !videoModel!.videoUrl.isEmpty
        {
            mediaPlayer.media = VLCMedia(url: URL(string: videoModel!.videoUrl)!)
            mediaPlayer.delegate = self
            mediaPlayer.drawable = self
            generateThumbnails()
        }
    }
    
    func playVideo()
    {
        if mediaPlayer.media != nil
        {
            mediaPlayer.play()
        }
    }
    
    func pauseVideo()
    {
        if mediaPlayer.media != nil && mediaPlayer.isPlaying
        {
            mediaPlayer.pause()
        }
    }
    
    func stopVideo()
    {
        if mediaPlayer.media != nil
        {
            mediaPlayer.stop()
        }
    }

    required init?(coder: NSCoder)
    {
      fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews()
    {
      super.layoutSubviews()
    }
     
    func generateThumbnails()
    {
        if mediaPlayer.media != nil
        {
            let vlcMediaThumbnailer: VLCMediaThumbnailer = VLCMediaThumbnailer(media: mediaPlayer.media, andDelegate: self)
            vlcMediaThumbnailer.thumbnailWidth = videoModel!.thumbnailWidth
            vlcMediaThumbnailer.thumbnailHeight = videoModel!.thumbnailHeight
            vlcMediaThumbnailer.snapshotPosition = 0.5

            vlcMediaThumbnailer.fetchThumbnail()
        }
    }

    func mediaThumbnailerDidTimeOut(_ mediaThumbnailer: VLCMediaThumbnailer!)
    {
        print("failed generating thumbnail")
    }
    
    func mediaThumbnailer(_ mediaThumbnailer: VLCMediaThumbnailer!, didFinishThumbnail thumbnail: CGImage!)
    {
        print("got another thumbnail")
        if(thumbnail != nil)
        {
            let thumbnailUIImage = UIImage(cgImage: thumbnail)
            let image = Image(uiImage: thumbnailUIImage).renderingMode(.original)
            videoModel!.thumbnails.append(image)
        }
    }
}

结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39870354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档