如何从 NSData 播放视频

Posted

技术标签:

【中文标题】如何从 NSData 播放视频【英文标题】:How to play video from NSData 【发布时间】:2011-02-17 08:32:49 【问题描述】:

我想知道是否可以使用 MPMoviePlayerController 从 NSData 对象播放视频。

【问题讨论】:

你从哪里得到数据? 来自我的数据库...而不是来自捆绑... 提醒未来的读者,MPMoviePlayerController 已被弃用...developer.apple.com/documentation/mediaplayer/… 【参考方案1】:

Ben 的答案在模拟器上完美运行,但无法在设备上运行,您无法在设备上的任何位置书写。检查下面的代码

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myMove.mp4"];

    [videoData writeToFile:path atomically:YES];
    NSURL *moveUrl = [NSURL fileURLWithPath:path];
    player = [[MPMoviePlayerController alloc]init];
    [player setContentURL:moveUrl];
    player.view.frame = viewPlayer.bounds;
    [viewPlayer addSubview:player.view];
    [player play];

【讨论】:

操作!我不敢相信我刚刚回答了一个一年前的问题......:) 我想知道是否有任何方法可以在不写入文件的情况下做到这一点? [[NSFileManager defaultManager] createFileAtPath:videoPath contents:videoData attributes:nil];【参考方案2】:

据我所知,这是不可能的。如果数据来自您的数据库,您可以将其保存到临时文件中并播放吗?

【讨论】:

是的,但我想避免这种情况... ;) 我现在正在尝试使用 QTKit 框架来执行此操作...【参考方案3】:

在这种情况下最好使用 NSFileManager 而不是 writeToFile

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myMove.mp4"];

[[NSFileManager defaultManager] createFileAtPath:path contents:videoData attributes:nil];

NSURL *moveUrl = [NSURL fileURLWithPath:path];
player = [[MPMoviePlayerController alloc]init];
[player setContentURL:moveUrl];
player.view.frame = viewPlayer.bounds;
[viewPlayer addSubview:player.view];
[player play];

【讨论】:

使用 createFileAtPath 与 writeToFile 有什么优势?【参考方案4】:

    创建一个具有 NSData 类型的文件,例如,如果您的 NSData 是 mp4 类型,则创建一个具有该类型的文件 - 例如 - “myMove.mp4”

    将文件复制到您的应用资源中

    添加此代码

    NSData *mediaData; //your data    
    NSString *movePath=[[NSBundle mainBundle] pathForResource:@"myMove" ofType:@"mp4"];         
    [mediaData writeToFile:movePath atomically:YES];        
    NSURL *moveUrl= [NSURL fileURLWithPath:movePath];    
    MPMoviePlayerController *movePlayer=[[MPMoviePlayerController alloc]init];          
    [movePlayer setContentURL:moveUrl]; 
    [movePlayer play];
    

【讨论】:

这在设备上不起作用,您无法在设备上的任何位置写入文件。在下面查看我的答案..

以上是关于如何从 NSData 播放视频的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的自定义制作 DASH 之类的视频播放器中制作 HLS 视频播放器?

如何从在线下载视频并将其存储在本地设备上,然后使用视频播放器在 Flutter 应用程序上播放视频?

播放通过 CloudKit 作为 CKAsset 下载的视频 - iOS

如何从 SD 卡播放视频

如何使用 Exoplayer 播放从 Mediastore 获取的视频

如何使用 Opencv 和 python 从网络上播放视频