在文档中,我看到了几个音频框架.所有这些似乎都是针对播放和录制音频.所以我想知道这些之间的巨大差异是什么?
音频工具箱,音频单元,AV基础和核心音频.或者我错过了一个能够很好地概述所有这些内容的指南?
我一直在使用自定义相机,最近我和Swift 3一起升级到Xcode 8 beta.我原来是这样的:
var stillImageOutput: AVCaptureStillImageOutput?
Run Code Online (Sandbox Code Playgroud)
但是,我现在收到警告:
在iOS 10.0中不推荐使用'AVCaptureStillImageOutput':改用AVCapturePhotoOutput
由于这是相当新的,我没有看到很多关于此的信息.这是我目前的代码:
var captureSession: AVCaptureSession?
var stillImageOutput: AVCaptureStillImageOutput?
var previewLayer: AVCaptureVideoPreviewLayer?
func clickPicture() {
if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo) {
videoConnection.videoOrientation = .portrait
stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in
if sampleBuffer != nil {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
let dataProvider = CGDataProvider(data: imageData!)
let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)
let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right)
}
})
}
} …Run Code Online (Sandbox Code Playgroud) 我在从CVPixelBuffer获取UIIMage时遇到一些问题.这就是我想要的:
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, imageDataSampleBuffer, kCMAttachmentMode_ShouldPropagate);
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments];
if (attachments)
CFRelease(attachments);
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
if (width && height) { // test to make sure we have valid dimensions
UIImage *image = [[UIImage alloc] initWithCIImage:ciImage];
UIImageView *lv = [[UIImageView alloc] initWithFrame:self.view.frame];
lv.contentMode = UIViewContentModeScaleAspectFill;
self.lockedView = lv;
[lv release];
self.lockedView.image = image;
[image release];
}
[ciImage release];
Run Code Online (Sandbox Code Playgroud)
height并且width都正确设置为相机的分辨率. image是创建但我似乎是黑色(或可能是透明的?).我不太明白问题出在哪里.任何想法,将不胜感激.
我一直在试图让我的头发试图让AVFoundation相机以正确的方向(即设备方向)拍摄图片,但我无法让它工作.
我看过教程,我看过WWDC演示文稿,我已经下载了WWDC示例程序,但即便如此也没有.
我的应用程序的代码是......
AVCaptureConnection *videoConnection = [CameraVC connectionWithMediaType:AVMediaTypeVideo fromConnections:[imageCaptureOutput connections]];
if ([videoConnection isVideoOrientationSupported])
{
[videoConnection setVideoOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
[imageCaptureOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
{
if (imageDataSampleBuffer != NULL)
{
//NSLog(@"%d", screenOrientation);
//CMSetAttachment(imageDataSampleBuffer, kCGImagePropertyOrientation, [NSString stringWithFormat:@"%d", screenOrientation], 0);
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self processImage:image];
}
}];
Run Code Online (Sandbox Code Playgroud)
(processImage使用与WWDC代码相同的writeImage ...方法)
并且WWDC应用程序的代码是......
AVCaptureConnection *videoConnection = [AVCamDemoCaptureManager connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
if ([videoConnection isVideoOrientationSupported]) {
[videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
}
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
if …Run Code Online (Sandbox Code Playgroud) 以下代码给出了警告Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>'(它是以下代码中的第三行):
NSURL *sound0URL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"0" ofType:@"aiff"]];
audioPlayer0 = [[AVAudioPlayer alloc] initWithContentsOfURL:sound0URL error:nil];
[audioPlayer0 setDelegate: self]; // <--- this line causes the warning
[audioPlayer0 prepareToPlay];
audioPlayer0.currentTime = 0;
[audioPlayer0 play];
Run Code Online (Sandbox Code Playgroud)
怎么修好?我在这个ViewController实例方法中有这个代码viewDidLoad.还有一个类似的问题但是这是一个类方法:从'Class'分配给'id <AVAudioPlayerDelegate>'的指针类型不兼容
我想用我的代码同时录制视频和抓取帧.
我AVCaptureVideoDataOutput用于抓取框架和AVCaptureMovieFileOutput视频录制.但无法工作,并在同时工作但个人工作时得到错误代码-12780.
我搜索了这个问题,但没有得到答案.有没有人有同样的经历或解释?一段时间我真的很烦.
谢谢.
我遇到了一个奇怪的问题,我希望有人可以提供帮助.
在我的iOS应用程序中,我MutableComposition通过组合用户照片库中的视频和应用程序包中的音频文件来创建带有自定义音轨的视频.然后,我使用一个AVPlayer并AVPlayerItem使用我制作的自定义视频播放器将视频播放回用户.
每次创建新的合成时,资产,播放器和合成都会被清除,释放,并且它基本上从干净的初始状态开始.
一切正常,直到完成4个成功的视频创建后,每次创建播放器的其他尝试都会失败并出现错误Cannot Decode.如果我正在重新创建的视频相同,与视频的大小/长度无关,或者音频文件与第五次尝试完全失败,就像发条一样无关紧要.一旦失败,它将永远失败!
这很奇怪,因为它只是对同一个视频进行了四次解码而没有任何问题,所以突然间它失败了?所以,如果有人有线索,请告诉我.
我正在尝试为我正在为iOS 4开发的应用程序设置背景音频.该应用程序没有专用的音乐播放器viewController,但不像其他背景音频应用程序,如Pandora,这使任务更多一点混乱.
我已Info.plist正确设置了适当的设置,并AVAudioPlayer在我的应用委托中有一个对象,可以从任何地方访问.当用户播放一首歌曲时,我用一首AVAudioPlayer用歌曲初始化的新歌曲替换它并播放它.这一切都很好,除了现在我不知道如何支持远程控制事件.
根据Apple的文档,我有这个:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch(event.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
if([iPhoneAppDelegate backgroundAudioPlayer].playing)
[iPhoneAppDelegate pauseBackgroundAudioPlayer];
else
[iPhoneAppDelegate playBackgroundAudioPlayer];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我在哪里放这个?Apple的文档似乎暗示这应该放在某个视图控制器的某个地方,但我的应用程序有很多视图控制器和导航控制器.无论我试图把它放在哪里,出于某种原因,在多任务托盘遥控器中点击切换播放/暂停按钮会导致歌曲暂停片刻然后取消暂停,或以某种方式使歌曲播放两次.
我正在使用AV Foundation类从相机捕获实时视频流并处理视频样本.这很好用.但是,一旦完成,我确实无法正确释放AV基础实例(捕获会话,预览层,输入和输出).
当我不再需要会话和所有关联对象时,我会停止捕获会话并释放它.这大部分时间都有效.但是,有时应用程序崩溃时会在调度队列(以及处理视频样本的位置)创建的第二个线程中引发EXEC_BAD_ACCESS信号.崩溃主要是由于我自己的类实例,它作为样本缓冲区委托,并在我停止捕获会话后被释放.
Apple文档提到了问题:停止捕获会话是一种异步操作.那就是:它不会立即发生.特别是,第二个线程继续处理视频样本并访问不同的实例,如捕获会话或输入和输出设备.
那么如何正确释放AVCaptureSession和所有相关实例呢?是否有通知可靠地告诉我AVCaptureSession已完成?
这是我的代码:
声明:
AVCaptureSession* session;
AVCaptureVideoPreviewLayer* previewLayer;
UIView* view;
Run Code Online (Sandbox Code Playgroud)
实例设置:
AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
session = [[AVCaptureSession alloc] init];
AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice: camera error: &error];
[session addInput: input];
AVCaptureVideoDataOutput* output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
[session addOutput: output];
dispatch_queue_t queue = dispatch_queue_create("augm_reality", NULL);
[output setSampleBufferDelegate: self queue: queue];
dispatch_release(queue);
previewLayer = [[AVCaptureVideoPreviewLayer layerWithSession: session] retain];
previewLayer.frame = view.bounds;
[view.layer addSublayer: previewLayer];
[session startRunning];
Run Code Online (Sandbox Code Playgroud)
清理:
[previewLayer removeFromSuperlayer];
[previewLayer release];
[session stopRunning];
[session release];
Run Code Online (Sandbox Code Playgroud) 我的应用程序播放流式音频AVPlayer,并用于MPNowPlayingInfoCenter在设备锁定屏幕上显示有关流的信息.
这在音频实际播放时工作正常,但如果流因网络减速(即我收到AVPlayerItemPlaybackStalledNotification)而停止,则信息会从锁定屏幕消失.但是如果流恢复播放,它会重新出现.
这是令人困惑的,因为当现在播放的信息从锁定屏幕消失时,它给出了应用程序已停止播放的外观.但是当锁定屏幕UI似乎表明这不会发生时,它会恢复播放.
有什么我可以做的事情来确保现在播放的信息在流应该播放时仍然可见,但目前不是由于网络速度问题?似乎保持一致的锁屏UI的唯一方法是在网络连接停止时实际终止它,这有点愚蠢但至少不会混淆.
如果更多细节会有所帮助:
MPNowPlayingInfoCenter当有一个当前程序时,应用程序永远不会清除,因此只要该流应该正在播放,就应该显示非空数据.avfoundation ×10
iphone ×7
ios ×6
audio ×3
camera ×3
avplayer ×2
core-audio ×1
ios4 ×1
orientation ×1
swift ×1
swift3 ×1
uiimage ×1