iOS AVPlayer无法播放视频。

6
我是一名有用的助手,可以为您翻译文本。

我正在尝试使用播放视频,所以我从教程中获取了一些代码,但它无法正常工作。

这是我使用的代码:

- (void) viewDidAppear:(BOOL)animated
{
    avAsset = [AVAsset assetWithURL:[NSURL URLWithString:filePath]];
    avPlayerItem =[avPlayerItem initWithAsset:avAsset];
    avPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem];
    avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
    [avPlayerLayer setFrame:self.view.frame];
    [self.view.layer addSublayer:avPlayerLayer];
    [avPlayer seekToTime:kCMTimeZero];
    [avPlayer play];

}

我不知道出了什么问题,它没有报错,只是出现了黑屏。谢谢。

4个回答

36

感谢s1mon和matt的帮助。

这是新代码,希望能对某些人有所帮助:

- (void) viewDidAppear:(BOOL)animated
{
    avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:filePath]];
    avPlayerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];
    avPlayer = [[AVPlayer alloc]initWithPlayerItem:avPlayerItem];
    avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:avPlayer];
    [avPlayerLayer setFrame:self.view.frame];
    [self.view.layer addSublayer:avPlayerLayer];
    //[avPlayerLayer setBackgroundColor:[[UIColor redColor]CGColor]];
    [avPlayer seekToTime:kCMTimeZero];
    [avPlayer play];

}

谢谢。


我尝试在我的应用程序中实现相同的代码,我正在使用Tableview来显示从服务器传输的所有视频,我有视频的URL,但是当我将其传递到单元格时,它无法播放,请帮忙... - ravinder521986
有趣的是,我将背景颜色设置为红色,就像您在注释掉的代码中所做的那样,以确保图层在屏幕上可见。 - ninjaneer

12

这可能不是实际问题,但这份代码肯定是错误的:

[NSURL URLWithString:filePath]

首先,尽量不要使用文件路径,而是使用文件URL。这样就不需要进行转换了。但是如果您必须从文件路径执行转换为URL,请使用fileURLWithPath:isDirectory:。文件URL是一种特殊的动物,当您从路径转换时,必须明确要求一个。


显然那就是问题所在 :D 谢谢你 :D - Ashraf Hussein
这太荒谬了。URLWithStringfileURLWithPath:都可以创建一个有效的NSURL实例。为什么前者不能与AVPlayer一起使用对我来说毫无意义。 - Legoless

3

我认为您忘记在这一行创建一个AVPlayerItem实例:

avPlayerItem =[avPlayerItem initWithAsset:avAsset];

这只是向 avPlayerItem 发送 initWithAsset: 方法(当调用此方法时,它可能为 nil)。请尝试更改它以实例化一个新的 AVPlayerItem,然后将其分配给 avPlayerItem,例如:

avPlayerItem = [[AVPlayerItem alloc] initWithAsset:avAsset];

这也是一个问题 :D 谢谢 :D - Ashraf Hussein

2

对于那些寻找 swift 2.0 版本 的人,这是我成功的方法。干杯。

import Foundation
import UIKit
import AVKit

class VideoViewController: AVPlayerViewController {

    override func viewDidAppear(animated: Bool) {
        self.setupVideoPlayerView()
    }
    private func setupVideoPlayerView()
    {
        let path = "HTTP_VIDEO_URL_HERE"
        let nsURL = NSURL(string: path)
        let avAsset = AVAsset(URL: nsURL!)
        let avPlayerItem = AVPlayerItem(asset: avAsset)

        let avPlayer = AVPlayer(playerItem: avPlayerItem)
        let avPlayerLayer = AVPlayerLayer(layer: avPlayer)

        avPlayerLayer.frame = self.view.frame
        self.view.layer.addSublayer(avPlayerLayer)

        self.player = avPlayer

        self.player!.seekToTime(kCMTimeZero)
        self.player!.play()

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接