标签: avfoundation

知道AVPlayer对象何时可以播放

我正在尝试播放一个MP3传递给UIView前一个文件的文件UIView(存储在一个NSURL *fileURL变量中).

我正在初始化一个AVPlayer:

player = [AVPlayer playerWithURL:fileURL];

NSLog(@"Player created:%d",player.status);
Run Code Online (Sandbox Code Playgroud)

我想的NSLog印刷品Player created:0,意味着它尚未准备好播放.

当我点击播放时UIButton,我运行的代码是:

-(IBAction)playButtonClicked
{
    NSLog(@"Clicked Play. MP3:%@",[fileURL absoluteString]);

    if(([player status] == AVPlayerStatusReadyToPlay) && !isPlaying)
//  if(!isPlaying)
    {
        [player play];
        NSLog(@"Playing:%@ with %d",[fileURL absoluteString], player.status);
        isPlaying = YES;
    }
    else if(isPlaying)
    {

        [player pause];
        NSLog(@"Pausing:%@",[fileURL absoluteString]);
        isPlaying = NO;
    }
    else {
        NSLog(@"Error in player??");
    }

}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我总是进入Error in player??控制台.然而,如果我用一个简单的...... 替换if检查是否 …

iphone avfoundation audio-streaming avplayer

71
推荐指数
8
解决办法
7万
查看次数

AVCaptureVideoPreviewLayer没有填满整个iPhone 4S屏幕

AVCaptureVideoPreviewLayer *avLayer = 
                [AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Run Code Online (Sandbox Code Playgroud)

我使用AVCaptureVideoPreviewLayer在视图上显示视频.但视频的视图并没有填满整个iPhone4的屏幕.(右侧和左侧有两个灰色条)

我希望视频能够全屏显示.我怎么处理它?非常感谢你!

在此输入图像描述

iphone avfoundation ios4

63
推荐指数
4
解决办法
3万
查看次数

AVPlayer HLS实时流量计(显示FFT数据)

我正在使用AVPlayerHTTP直播的无线电应用程序.现在我想为该音频流实现一个电平表.最好的水平仪显示不同的频率,但简单的左/右解决方案将是一个很好的起点.

我发现了几个使用的例子AVAudioPlayer.但我无法找到解决所需信息的解决方案AVPlayer.

有人能想到我的问题的解决方案吗?

编辑我想创建这样的东西(但更好)

很好的水平仪

编辑二

一个建议是用于MTAudioProcessingTap获取原始音频数据.我可以使用[[[_player currentItem] asset] tracks]数组找到的例子,在我的例子中,是一个空数组.另一个建议是使用[[_player currentItem] audioMix]哪个null适合我.

编辑III

经过多年,似乎仍然没有解决方案.我确实取得了进步,所以我正在分享它.

在设置过程中,我正在向playerItem添加一个键值观察器:

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- …
Run Code Online (Sandbox Code Playgroud)

objective-c avfoundation media-player ios avplayer

60
推荐指数
1
解决办法
3429
查看次数

AVAudioPlayer没有播放任何声音

我正在开发一个需要使用AVFoundation框架播放声音的iOS应用程序.Xcode 4中的工作区结构包含两个项目:

  • 工作区
    • 应用程序本身(主要项目)
    • 实用程序库

构建实用程序库之后,它会生成一个静态库,该库在主应用程序中用作框架.

因此,当尝试使用下面的代码在主应用程序内播放声音时,它会按预期工作.

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];

NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                                    error:&error];
[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)

相反,当尝试使用与上面相同的代码在实用程序库中播放完全相同的声音(或任何其他声音)时,即使错误为nilaudioPlayer属性值为正确,也不会播放任何声音(数字)频道,持续时间).

我确保AVFoundation框架在两个项目中.

此外,我的类使用AVAudioPlayerDelegate协议并实现这两个方法:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)

尝试播放声音后,这些方法都不会被调用.

如果我使用AudioToolbox框架,那么它会播放声音.但AVFoundation由于几个原因,我对使用感兴趣.

怎么知道发生了什么?我错过了什么AVFoundation吗?它可能与AVAudioPlayer在静态库中使用有关吗?

提前致谢.

audio objective-c avfoundation xcode4 automatic-ref-counting

58
推荐指数
5
解决办法
3万
查看次数

使用FFmpeg在iOS上编写时将fMP4转码为HLS

TL; DR

我想将fMP4片段转换为TS段(用于HLS),因为片段是在iOS设备上使用FFmpeg编写的.

为什么?

我正在尝试在iOS上实现实时上传,同时在本地保持无缝的高清副本.

我试过的

  1. 滚动AVAssetWriters,每次写入8秒,然后通过FFmpeg连接MP4.

    出了什么问题 - 音频和视频有时会出现问题.我已经确定了3个原因.

    1)为AAC编码器写入的音频启动帧,从而产生间隙.

    2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们可能不在文件末尾排队.

    3)Mac OS上缺少帧精确编码,但iOS 详细信息不适用于此

  2. FFmpeg将具有原始音频的大视频MP4文件复用到TS段中.这项工作基于Kickflip SDK

    什么是错的 - 每隔一段时间,只有一个音频文件会上传,没有任何视频.永远不能在内部重现它,但当他们没有记录他们认为他们做的事情时,它对我们的用户来说非常令人沮丧.在最后一段上也存在准确搜索的问题,几乎就像TS段的时间戳错误一样.

我现在在想什么

苹果公司今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行太多调查.由于fMP4文件可以在写入读取和播放,我认为FFmpeg也可以在写入时对文件进行转码,只要我们阻止将字节发送到FFmpeg直到每个片段内文件完成了.

但是,我对FFmpeg C API并不熟悉,我只是在尝试#2中简单地使用它.

我需要你什么

  1. 这是可行的解决方案吗?有人对fMP4足够熟悉,知道我是否真的可以做到这一点?
  2. 我怎么知道AVFoundation已经完成在文件中写一个片段,以便我可以将它管道输入FFmpeg?
  3. 如何从磁盘上的文件中获取数据,一次块,将其传递给FFmpeg并让它吐出TS段?

ffmpeg avfoundation http-live-streaming ios fmp4

57
推荐指数
1
解决办法
1774
查看次数

如何减少使用UIImagePickerController创建的视频的文件大小?

我有一个应用程序,允许用户录制视频,UIImagePickerController然后将其上传到YouTube.问题是UIImagePickerController创建的视频文件是巨大的,即使视频只有5秒长.例如,5秒长的视频是16-20兆字节.我想保持540或720质量的视频,但我想减少文件大小.

我一直在尝试AVFoundation并AVAssetExportSession试图获得更小的文件大小.我试过以下代码:

AVAsset *video = [AVAsset assetWithURL:videoURL];
AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:video presetName:AVAssetExportPresetPassthrough];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.outputURL = [pathToSavedVideosDirectory URLByAppendingPathComponent:@"vid1.mp4"];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
    NSLog(@"done processing video!");
}];
Run Code Online (Sandbox Code Playgroud)

但这并没有减少文件大小.我知道我正在做的事情是可能的,因为在Apple的照片应用程序中,当您选择"在YouTube上分享"时,会自动处理视频文件,因此它的小到可以上传.我想在我的应用程序中做同样的事情.

我怎么能做到这一点?

video file-upload objective-c avfoundation ios

56
推荐指数
7
解决办法
6万
查看次数

AVCaptureVideoPreviewLayer方向 - 需要景观

我的应用只是风景.我将这样呈现AVCaptureVideoPreviewLayer:

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
[self.previewLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
[self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspect];                    
NSLog(@"previewView: %@", self.previewView);
CALayer *rootLayer = [self.previewView layer];
[rootLayer setMasksToBounds:YES];
[self.previewLayer setFrame:[rootLayer bounds]];
    NSLog(@"previewlayer: %f, %f, %f, %f", self.previewLayer.frame.origin.x, self.previewLayer.frame.origin.y, self.previewLayer.frame.size.width, self.previewLayer.frame.size.height);
[rootLayer addSublayer:self.previewLayer];
[session startRunning];
Run Code Online (Sandbox Code Playgroud)

self.previewView的框架为(0,0,568,320),这是正确的.self.previewLayer记录一个(0,0,568,320)的帧,这在理论上是正确的.但是,相机显示在横向屏幕中间显示为纵向矩形,并且相机预览图像的方向错误90度.我究竟做错了什么?我需要相机预览层出现在全屏幕,在横向模式下,图像应正确导向.

avfoundation orientation ios avcapture avcapturesession

56
推荐指数
6
解决办法
5万
查看次数

使用AVPlayer时保持良好的滚动性能

我正在开发一个有集合视图的应用程序,集合视图的单元格可以包含视频.现在我正在用AVPlayer和显示视频AVPlayerLayer.不幸的是,滚动性能很糟糕.看起来AVPlayer,AVPlayerItemAVPlayerLayer做了很多工作的主线上.他们不断拿出锁,等待信号量等,这阻碍了主线程并导致严重的帧丢失.

有没有办法告诉AVPlayer停止在主线程上做这么多事情?到目前为止,我所尝试的一切都没有解决问题.

我也试过使用构建一个简单的视频播放器AVSampleBufferDisplayLayer.使用它我可以确保一切都发生在主线程之外,我可以在滚动和播放视频时达到~60fps.不幸的是,这种方法的级别要低得多,而且它不提供开箱即用的音频播放和时间擦除等功能.有没有办法获得类似的表现AVPlayer?我更愿意使用它.

编辑: 在进一步研究之后,看起来在使用时可能无法实现良好的滚动性能AVPlayer.创建一个AVPlayer并与一个AVPlayerItem实例关联开始了一大堆蹦床到主线程的工作,然后它在信号量上等待并尝试获取一堆锁.随着滚动视图中视频数量的增加,停止主线程的时间量会急剧增加.

AVPlayerdealloc似乎也是一个巨大的问题.Dealloc'ing an AVPlayer也尝试同步一堆东西.再次,当你创造更多的球员时,这会非常糟糕.

这非常令人沮丧,它AVPlayer几乎无法用于我正在尝试的事情.阻止像这样的主线程这样做是一件非常业余的事情,很难相信苹果工程师会犯这种错误.无论如何,希望他们能尽快解决这个问题.

video avfoundation ios avplayer

56
推荐指数
3
解决办法
1万
查看次数

AVAssetImageGenerator提供旋转的图像

当通过AVAssetImageGenerator获取视频的UIImage时,当视频以纵向方向拍摄时,我会返回旋转的图像(技术上它们不是).如何判断视频的拍摄方向,然后正确旋转图像?

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *err = NULL;
CMTime time = CMTimeMake(0, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
[generate release];
UIImage *currentImg = [[UIImage alloc] initWithCGImage:imgRef];
Run Code Online (Sandbox Code Playgroud)

iphone objective-c avfoundation ios

50
推荐指数
3
解决办法
1万
查看次数

AVAudioSession setCategory Swift 4.2 iOS 12 - 静音播放声音

要在静音模式下播放声音我使用以下方法.但它是如何不起作用的.

// Works on Swift 3  
do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

如何让它在4.2/iOS 12中运行?

在较新的版本中,我们需要设置模式和选项.

try AVAudioSession.sharedInstance().setCategory(
    <#T##category:AVAudioSession.Category##AVAudioSession.Category#>,
    mode: <#T##AVAudioSession.Mode#>, 
    options: <#T##AVAudioSession.CategoryOptions#>)`
Run Code Online (Sandbox Code Playgroud)

avfoundation ios avaudiosession swift

50
推荐指数
6
解决办法
3万
查看次数