Tag: avfoundation

为什么AVFoundation不能在iOS设备上接受我的平面像素缓冲区?

我一直在努力弄清楚我的代码有什么问题。 我正在创build一个平面CVPixelBufferRef写入AVAssetWriter 。 这个像素缓冲区是通过一些其他的过程手动创build的(也就是说,我没有从相机或类似的东西那里得到这些样本)。 在iOS模拟器上,添加示例并创build有效的输出影片没有任何问题。 但是,在设备上,它立即在第一个样本失败,并提供less于无用的错误信息: AVAssetWriterError: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x12fd2c670 {Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-12780), NSLocalizedDescription=The operation could not be completed} 我对像素格式很陌生,如果我以某种方式创build了无效的像素缓冲区,我不会感到惊讶,但在模拟器(即OS X)上工作得很好的事实让我感到困惑。 这是我的代码: const int pixelBufferWidth = img->get_width(); const int pixelBufferHeight = img->get_height(); size_t planeWidths[3]; size_t planeHeights[3]; size_t planeBytesPerRow[3]; void* planeBaseAddresses[3]; for (int […]

使用AVFoundation扫描PDF417条形码

我有一个工作的iOS条码扫描器,使用iOS 7中新的AVFoundation条码扫描类。我可以成功获取一维条码的string表示(例如,UPC条形码),但是我也需要扫描二维PDF417条形码。 我似乎无法弄清楚如何获得存储在PDF417条形码中的数据的string表示forms(或任何表示forms)。 扫描器识别条形码并返回AVMetadataMachineReadableCodeObject,但将stringValue消息发送给此对象返回nil。 从文档描述该方法说: 此属性的值是根据机器可读代码的格式解码二进制有效负载而创build的NSString,如果无法创buildstring表示,则为nil 所以看起来不能创build一个string表示。 没关系,但是我该怎么办呢? 这个类似乎没有任何其他方法可以返回原始数据或任何有关扫描的条形码的有用信息。

AVPlayer在播放HLS / AESencryptionvideo之前做出无关紧要的http请求

我们在iOS 8.4上使用AVPlayer播放HLS,AESencryption的video。 我们的.m3u8文件包​​括许可证服务器的URL,例如: EXT-X-KEY:METHOD = AES-128,URI = “https://开头……” 在我们的iOS应用程序中,我们使用AVAssetResourceLoaderDelegate方法resourceLoader:shouldWaitForLoadingOfRequestedResource:拦截由AVPlayer(或AVFoundation中的某个对象)发送到许可证服务器的请求。 在该方法中,我们添加一个令牌(许可证服务器要求)到请求的queryString。 许可证服务器用令牌接收请求,返回encryption密钥,并开始回放。 换句话说,一切都按预期工作。 但是 ,我们注意到(在使用“Charles”http monitor的情况下),在创buildAVPlayerItem之后,在调用resourceLoader:方法之前,AVFoundation 向许可证服务器url发送初始请求; 一个不通过方法resourceLoader“路由”的请求: 。 这个请求在服务器上被拒绝了,因为我们的iOS代码从来没有机会在请求消失之前追加令牌。 事件摘要: •AVPlayerItem / AVAsset是使用.m3u8索引文件的URL创build和初始化的。 •AVFoundation框架内的某些内容向.m3u8文件中指定的许可证服务器发出请求。 这个初始请求不被方法recourceLoader拦截:shouldWaitForLoadingOfRequestedResource:并且未修改的请求到达许可证服务器。 由于请求在查询string中不包含所需的标记,因此失败并且不返回encryption密钥。 • AVFoundation向licesnse服务器发出第二个请求 。 这个请求被recourceLoader捕获:…并被适当的修改。 许可证服务器返回encryption密钥并开始播放。 这种行为可以使用Apple的AVARLDelegateDemo应用程序进行复制。 问题: AVFoundation发送的初始http请求是否正常? 如果是这样,为什么它是必要的,为什么不通过resourceLoader:方法“路由”? 是否可以抑制初始请求或在发送之前对其进行修改? 谢谢!

iOS版。 用USB麦克风以96kHzlogging

我正试图用我的RØDEiXY USB麦克风以全频率录制。 录制过程没有错误,当我连接麦克风启动应用程序时,我发现AVAudioSession以96kHz采样率成功运行。 但是如果我看一下这个频谱,很明显除了20kHz以上的重采样噪声外, 为了便于比较,这是使用与USB麦克风(RØDERec)捆绑在一起的应用程序logging的相同频谱: 还有什么我必须做的logging在本机96kHz? 或者,也许RØDERec应用程序通过USB与一些专有协议的麦克风进行通信,我在这里运气不好? 我包含了我使用的源代码: static AudioStreamBasicDescription AudioDescription24BitStereo96000 = (AudioStreamBasicDescription) { .mFormatID = kAudioFormatLinearPCM, .mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger, .mChannelsPerFrame = 2, .mBytesPerPacket = 6, .mFramesPerPacket = 1, .mBytesPerFrame = 6, .mBitsPerChannel = 24, .mSampleRate = 96000.0 }; – (void)setupAudioSession { AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryRecord error:&error]; [session setActive:YES error:&error]; […]

iOS检测系统音量水平变化。 私人API或不? AVSystemController_SystemVolumeDidChangeNotification

可以听AVSystemController_SystemVolumeDidChangeNotification NSNotification(在App Store审查过程中)是否使用私有API? 在我的应用程序中,我需要显示和更新当前音量。 在按下硬件音量button和MPVolumeView滑块中的音量更改之后,音量指示符应该更新。 我已经search了解决scheme如何获得硬件音量button按通知或事件,并已find一些解决scheme。 例如, iPhone检测音量键按下。 和 如何在iOS上获得音量级别和音量更改通知? 我喜欢听NSNotificationCenter的解决scheme,似乎最简单和明确的解决scheme是听AVSystemController_SystemVolumeDidChangeNotification (它工作正常) 但有一件重要的事情我想知道。 此通知名称不在任何官方Apple文档中出现,并且有关是否将此通知用法视为“使用私有API”的讨论。 据我所知,使用私有API与调用私有方法连接。 这就是为什么使用这个通知密钥不能被视为私人API使用(因为实际上我们正在使用通知名称作为NSString)。 也许有人知道这是肯定的,或者有AVSystemController_SystemVolumeDidChangeNotification使用经验和应用程序被提交/拒绝? 非常感谢您的任何信息!

Swift 3中的AVCaptureStillImageOutput与AVCapturePhotoOutput

我想简单地把我的视图控制器中的相机视图。 我在顶部导入了AVFoundation ,以及UIImagePickerControllerDelegate和UINavigationControllerDelegate类。 然而,每当我尝试使用AVCaptureStillImageOutput ,Xcode告诉我,它已被弃用iOS10,我应该使用AVCapturePhotoOutput 。 这是完全好的,但是,只要我想调用stillImageOutput.outputSettings , .outputSettings本身不可用。 因此,我不得不使用AVAVCaptureStillImageOutput它的工作,但我有多个警告,因为这个function已被弃用iOS10。 我search和search,但无法真正find解决scheme。 我将衷心感谢您的帮助。 我正在学习,所以任何解释都会很棒! 代码如下。 import UIKit import AVFoundation class CameraView: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var captureSession : AVCaptureSession? var stillImageOutput : AVCaptureStillImageOutput? var previewLayer : AVCaptureVideoPreviewLayer? @IBOutlet var cameraView: UIView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) captureSession = AVCaptureSession() captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080 var backCamera […]

适用于带有AVFoundation的AVAudioUnitSampler的正确音量信封

如何正确创buildAVAudioUnitSampler的卷信封? 基本上我想添加一个攻击阶段,其中的体积在几毫秒内消失,以避免点击。 另外,我想添加一个释放阶段,以便在播放音符后音量消失。 我到目前为止做了什么: 我设置了一个代表我的采样率的全局计时器。 为此,我使用了一个间隔长度为1个样本的NSTimer(对于样本率44100,一个样本持续时间是1/44100)。 这样一个人不应该听到音量“跳跃”导致“点击”。 也许我需要过采样两倍的采样率。 只要增益低于某个阈值,定时器就会调用一个增加masterGain的函数。 通过将期望和当前增益的差值除以采样率,然后将该值除以所需的衰减时间,来计算增加的​​量。 (在下面的例子中,我使用一个固定的值来简化阅读) 达到阈值后,取出计时器并停止笔记。 – >我认为这种方法非常复杂,尤其是在我使用发布阶段的时候。 请检查我的示例代码。 我用UIButton touchDown来触发弹奏的音符。 请告诉我,如果你知道一个更简单的方法随着时间的推移自动化的价值/build立一个淡入/淡出的体积。 谢谢 import UIKit import AVFoundation class ViewController: UIViewController { var engine: AVAudioEngine! var sampler: AVAudioUnitSampler! var error: NSError? var timer: NSTimer = NSTimer() override func viewDidLoad() { super.viewDidLoad() engine = AVAudioEngine() sampler = AVAudioUnitSampler() engine.attachNode(sampler) engine.connect(sampler, to: […]

将Swift UnsafePointer <AudioStreamBasicDescription>转换为字典?

我想知道如何从UnsafePointer<AudioStreamBasicDescription>创build[String:AnyObject]的字典, 我想我不明白如何在Swift使用UnsafePointer<T> 。 这里是我从哪里开始 – AVAudioFile类有一个AVAudioFormattypes的fileFormat属性。 AVAudioFormat有一个streamDescription属性,它返回一个UnsafePointer<AudioStreamBasicDescription>作为只读属性。 我想看看这个结构中的值是什么,转换成一个字典似乎可能是合理的目标。 实际上,在AVAudioFormat类中似乎已经有一个“设置”属性,但是我有兴趣理解访问存储在UnsafePointer的值的“正确方法”。 从文档Discussion: Returns the AudioStreamBasicDescription (ASBD) struct, for use with lower-level audio APIs https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioFormat_Class/index.html 检查结构是否不为零后有没有办法做一个不安全的转换? 我会在这里使用unsafeBitCast吗? 我太犹豫了,因为我读过这个“非常危险的” 我意识到我可以通过以下方式访问底层内存: let audioFileURL:NSURL = NSBundle.mainBundle().URLForResource("FILENAME", with Extension: "mp3") var file:AVAudioFile? do { file = try AVAudioFile(forReading: audioFileURL) guard let file = file else { fatalError("file must not be nil") } […]

.aifaudio文件转换的kAudioFormat?

我想从AAC格式转换/保存audio文件为AIFFaudio格式。 默认我想用LineraPCM。 。 但audio格式保存为AAC格式。 。 我想以AIFF格式保存audio文件。这是我的代码 NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, [NSNumber numberWithInt:2], AVNumberOfChannelsKey, [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey, [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey, [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, nil]; 任何人都可以请kAudioFormat或audio设置的build议来使用AVAssetWriterInput写入文件保存在AIFFaudio格式?

IOS从networking接收video

更新 – 我已经修复了下面的代码中的一些错误,图像显示在其他设备上,但我还有一个问题。 video捕捉打开时,“主”设备连续发送数据,有时这种捕捉会出现在“从属”设备上,并且在很短的时间内,图像会“闪烁”为空白并在短时间内重复播放。 任何想法呢? 我正在开发一款应用程序,需要将实时相机捕获和实时麦克风捕获发送到networking中的其他设备。 我已经完成了使用TCP服务器的设备之间的连接,并用bonjour发布它,这就像一个魅力。 最重要的部分是要发送和接收来自“主”设备的video和audio,并将其呈现在“从”设备上。 首先,这里是一段代码,让应用程序获取相机采样缓冲区,并在UIImage中进行转换: @implementation AVCaptureManager (AVCaptureVideoDataOutputSampleBufferDelegate) – (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { dispatch_sync(dispatch_get_main_queue(), ^{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; UIImage *image = [self imageFromSampleBuffer:sampleBuffer]; NSData *data = UIImageJPEGRepresentation(image, 0.2); [self.delegate didReceivedImage:image]; [self.delegate didReceivedFrame:data]; [pool drain]; }); } – (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); […]