我想知道代表音乐曲目的MPMediaItem是否适用于受Fairplay/DRM保护的项目.有什么办法吗?
在OS X上使用AVFoundation播放视频时,我正在尝试显示字幕.
我查看了文档,但找不到启用字幕轨道的方法.API包含对字幕轨道的多个引用,这使我相信它是受支持的.
在iOS上,该方法-[AVPlayerItem selectMediaOption:inMediaSelectionGroup:]用于启用字幕轨道.此方法在10.7 SDK中不可用.还有另一种显示字幕的方法吗?
编辑:Quicktime播放器X具有字幕支持,例如在打开此电影时,字幕子菜单似乎提供语言选择,并在选择英语时显示它们.这让我相信它们已包含在API中......
我试图插入指明了AVPlayerItem的AVURLAsset AVPlayerItemStatusReadyToPlay成AVMutableComposition这样:
composition_ = [[AVMutableComposition alloc] init];
insertionPoint_ = kCMTimeZero;
item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]] retain];
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil];
player_ = [[AVPlayer playerWithPlayerItem:item_] retain];
[player_ addObserver:self forKeyPath:@"currentItem.duration" options:0 context:nil];
/**
* append a player-item to our composition
*/
- (void)addItemToComposition:(AVPlayerItem *)item
{
NSError *error = nil;
VTRACE(@"item duration: %g", CMTimeGetSeconds(item.duration));
if (![composition_ insertTimeRange:CMTimeRangeMake(kCMTimeZero, item.duration)
ofAsset:item.asset
atTime:insertionPoint_
error:&error])
{
VTRACE(@"error: %@", error);
}
}
/**
* simplified value observer callback
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary …Run Code Online (Sandbox Code Playgroud) 我们有通过bitmovin.com编码的视频,并以HTTP Live Streams(Fairplay HLS)的形式提供,但字幕虽然是WebVTT格式,但是作为整个文件的直接URL单独公开,而不是单个段,并且不是HLS m3u8播放列表的一部分.
我正在寻找单独下载的外部.vtt文件如何仍然包含在HLS流中并作为AVPlayer中的副标题提供的方式.
我知道Apple的建议是将分段的VTT字幕包含在HLS播放列表中,但我现在无法改变服务器实现,所以我想澄清是否有可能为AVPlayer提供字幕以与HLS流一起播放.
关于这个主题的唯一有效帖子声称它是可能的:AVPlayer/MPMoviePlayerController的字幕.但是,示例代码从bundle加载本地mp4文件,我正在努力使其适用于m3u8播放列表AVURLAsset.实际上,我有问题从远程m3u8流中获取videoTrack作为asset.tracks(withMediaType: AVMediaTypeVideo)返回空数组.任何想法,如果这种方法可以用于真正的HLS流?或者有没有其他方法可以使用HLS流播放单独的WebVTT字幕,而不将它们包含在服务器上的HLS播放列表中?谢谢.
func playFpsVideo(with asset: AVURLAsset, at context: UIViewController) {
let composition = AVMutableComposition()
// Video
let videoTrack = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
let tracks = asset.tracks(withMediaType: AVMediaTypeVideo)
// ==> The code breaks here, tracks is an empty array
guard let track = tracks.first else {
Log.error("Can't get first video track")
return
}
try videoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, asset.duration), of: track, at: kCMTimeZero)
} catch {
Log.error(error)
return …Run Code Online (Sandbox Code Playgroud) avfoundation ×3
avplayer ×2
ios ×2
iphone ×2
avkit ×1
cocoa ×1
drm ×1
macos ×1
mpmediaitem ×1
objective-c ×1