- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 avplayer 在 OSX 上实现一个 HTTP 实时流媒体播放器。我能够正确地流式传输它寻求并获得持续时间等。现在我想拍摄屏幕截图并使用 OpenCV 处理其中的帧。我去使用 AVASSetImageGenerator。但是与player.currentItem关联的AVAsset没有音视频轨道。
轨道出现在 player.currentItem.tracks 中。所以我不能起诉 AVAssetGenerator。任何人都可以帮助找到在这种情况下提取屏幕截图和单个帧的解决方案吗?
请在下面找到我如何启动 HTTP 直播流的代码
提前致谢。
NSURL* url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
playeritem = [AVPlayerItem playerItemWithURL:url];
[playeritem addObserver:self forKeyPath:@"status" options:0 context:AVSPPlayerStatusContext];
[self setPlayer:[AVPlayer playerWithPlayerItem:playeritem]];
[self addObserver:self forKeyPath:@"player.rate" options:NSKeyValueObservingOptionNew context:AVSPPlayerRateContext];
[self addObserver:self forKeyPath:@"player.currentItem.status" options:NSKeyValueObservingOptionNew context:AVSPPlayerItemStatusContext];
AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:[self player]];
[newPlayerLayer setFrame:[[[self playerView] layer] bounds]];
[newPlayerLayer setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
[newPlayerLayer setHidden:YES];
[[[self playerView] layer] addSublayer:newPlayerLayer];
[self setPlayerLayer:newPlayerLayer];
[self addObserver:self forKeyPath:@"playerLayer.readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVSPPlayerLayerReadyForDisplay];
[self.player play];
以下是我如何检查 Assets 是否存在视频轨道
case AVPlayerItemStatusReadyToPlay:
[self setTimeObserverToken:[[self player] addPeriodicTimeObserverForInterval:CMTimeMake(1, 10) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
[[self timeSlider] setDoubleValue:CMTimeGetSeconds(time)];
NSLog(@"%f,%f,%f",[self currentTime],[self duration],[[self player] rate]);
AVPlayerItem *item = playeritem;
if(item.status == AVPlayerItemStatusReadyToPlay)
{
AVAsset *asset = (AVAsset *)item.asset;
long audiotracks = [[asset tracks] count];
long videotracks = [[asset availableMediaCharacteristicsWithMediaSelectionOptions]count];
NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks);
}
}]];
AVPlayerItem *item = self.player.currentItem;
if(item.status != AVPlayerItemStatusReadyToPlay)
return;
AVURLAsset *asset = (AVURLAsset *)item.asset;
long audiotracks = [[asset tracksWithMediaType:AVMediaTypeAudio]count];
long videotracks = [[asset tracksWithMediaType:AVMediaTypeVideo]count];
NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks);
最佳答案
这是一个较老的问题,但如果有人需要帮助,我有一个答案
AVURLAsset *asset = /* Your Asset here! */;
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.requestedTimeToleranceAfter = kCMTimeZero;
generator.requestedTimeToleranceBefore = kCMTimeZero;
for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) * /* Put the FPS of the source video here */ ; i++){
@autoreleasepool {
CMTime time = CMTimeMake(i, /* Put the FPS of the source video here */);
NSError *err;
CMTime actualTime;
CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err];
// Do what you want with the image, for example save it as UIImage
UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
}
}
您可以使用以下代码轻松获取视频的 FPS:
float fps=0.00;
if (asset) {
AVAssetTrack * videoATrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];
if(videoATrack)
{
fps = [videoATrack nominalFrameRate];
}
}
希望对询问如何从视频中获取所有帧或仅获取某些特定帧(例如 CMTime)的人有所帮助。请记住,将所有帧保存到数组中几乎不会影响内存!
关于opencv - HTTP 直播流 AVAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217195/
最近,开始注意到从照片库导入某些 Assets 时未显示它们。有问题的 Assets 存储在 iCloud 中,不会缓存在设备上。 我相信这是 iOS 14 的问题,因为我从未在 iOS 13 上遇到
有没有办法将数据转换为 AVAsset/AVURLAsset 或更好的 AVPlayerItem? 我找到了一个将 Data 转换为 PHAsset 并需要先将其保存到桌面的答案。 有没有更好的办法?
我有一个适用于 iOS6 及更高版本的音乐播放器应用程序。我的音乐播放器工作正常,它可以在线(流媒体)和离线(本地 mp3 文件)播放音乐。 当我将蓝牙耳机连接到我的设备(iPad 或 iPhone)
给定从 Assets 读取的 CMSampleBuffers 列表,我想调整 Assets 的持续时间,使其长度为原始 Assets 的一半(速度的两倍)。 目前我用于生成新时间戳的函数如下所示: f
我在我的应用程序中使用 AVAsset 并遇到了下一个问题。当我写这样的东西时: AVAsset *audioAsset = [AVAsset assetWithURL:[NSURL fileURLW
我正在我的应用程序中下载和缓存(使用 https://github.com/vdugnist/DVAssetLoaderDelegate )视频。当应用程序启动时,我检查下载的文件,如果它存在,我用本
我想创建像视频 View 一样的照片,在页脚中会有一秒的视频帧。 为此我正在使用这段代码 var imgs : [UIImage] = [] let assetImgGenerate : AVAsse
我有一些简单的 AVFoundation 代码可以将一堆四秒长的 mp4 文件连接在一起,如下所示: func compose(parts inParts: [Part], progress inPr
我已经尝试了很多东西,我也浏览了互联网,但我找不到解决以下问题的方法。Xcode 向我显示此错误: Use of unresolved identifier 'AVAsset' 即使我已经导入了 AV
NSURL* fileURL=[_musicListViewModel fileURLWithModel:model]; NSData* assetData=[NSData dataWithConte
我只想使用 native API(UIKit、AVFoundation、Core Image 等)来过滤 AVAsset,同时在 AVPlayerLayer 或等效的 UI 组件中显示它。我不会使用
我在 Mac 播放器中有视频,视频时长为 31 秒。当我在我的应用程序中使用它并加载该文件时,AVAsset 的持续时间为“28.03”。 AVAsset *videoAsset = [AVAsset
本质上,我希望连接 AVAsset 文件。我大致知道该怎么做,但我正在努力加载音频文件。 我可以使用 AVAudioPlayer 播放文件,我可以通过我的终端在目录中看到它们,但是当我尝试使用 AVA
我正在尝试使用 AVFoundation 一起编辑视频和图像。然而,AVAsset 似乎无法从图像文件创建?有人给我一些建议吗? 最佳答案 好的,我很确定 AVAsset 是为媒体准备的,所以 AVA
我正在处理一个需要对大量短(1-5 秒)进行排序的项目(问题在 n = 30 或更少时可见)AVAsset s。我能找到的所有引用资料和示例项目都指向使用范围 CMTimeRange(start: .
我想使用AVAssetExportSession合成两个音频。当我使用AVAsset来通过'tracksWithMediaType:AVMediaTypeAudio'进行跟踪时,我得到了一个空数组。
我正在开发一个播放视频并允许用户在视频中向前和向后滑动的应用程序。擦洗必须顺利进行,所以我们总是用 SDAVAssetExportSession 重写视频具有视频压缩属性 AVVideoMaxKeyF
我有兴趣获取 AVAsset 的资源名称(又名文件名) ,特别是mp4视频。 Assets 是使用资源名称创建的,我只是想在将来只有 AVAsset 时获得相同的字符串资源实例。在这种情况下,我怎样才
我正在尝试根据声音文件渲染音频波形。我找到了很多教程来展示如何做到这一点,但我没有找到太多涵盖 AVAsset 的文档。 .我查看了苹果文档,但我发现它有点含糊。 我真的很想了解基础知识而不是跳来跳去
当应用程序进入后台时,我的[AVAssetWriter startWriting]被调用,并且由于以下错误而失败: Error Domain = AVFoundationErrorDomain代码=
我是一名优秀的程序员,十分优秀!