我正在开发一个应用程序,它需要尽可能多地捕获帧缓冲区.我已经想出如何强制iPhone以60 fps的速度捕获但是
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
Run Code Online (Sandbox Code Playgroud)
方法每秒只被调用15次,这意味着iPhone将捕获输出降级为15 fps.
有人遇到过这样的问题吗?是否有可能提高捕获帧率?
更新我的代码:
camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if([camera isTorchModeSupported:AVCaptureTorchModeOn]) {
[camera lockForConfiguration:nil];
camera.torchMode=AVCaptureTorchModeOn;
[camera unlockForConfiguration];
}
[self configureCameraForHighestFrameRate:camera];
// Create a AVCaptureInput with the camera device
NSError *error=nil;
AVCaptureInput* cameraInput = [[AVCaptureDeviceInput alloc] initWithDevice:camera error:&error];
if (cameraInput == nil) {
NSLog(@"Error to create camera capture:%@",error);
}
// Set the output
AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init];
// create a queue to run the capture on
dispatch_queue_t captureQueue=dispatch_queue_create("captureQueue", NULL);
// setup …Run Code Online (Sandbox Code Playgroud) 无法想象这一个.当应用程序处于活动状态时,一切正常,有时当我将应用程序移动到后台(按下主页按钮)而不是返回时,预览层会冻结/卡住.我使用viewWillAppear和viewDidAppear进行设置.这是我如何设置一切:
var backCamera = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
var global_device : AVCaptureDevice!
var captureSession: AVCaptureSession?
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
captureSession = AVCaptureSession()
captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
CorrectPosition = AVCaptureDevicePosition.Back
for device in backCamera {
if device.position == AVCaptureDevicePosition.Back {
global_device = device as! AVCaptureDevice
CorrectPosition = AVCaptureDevicePosition.Back
break
}
}
configureCamera()
var error: NSError?
var input = AVCaptureDeviceInput(device: global_device, error: &error)
if error == nil && captureSession!.canAddInput(input) {
captureSession!.addInput(input)
stillImageOutput = AVCaptureStillImageOutput()
stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
if captureSession!.canAddOutput(stillImageOutput) {
captureSession!.addOutput(stillImageOutput) …Run Code Online (Sandbox Code Playgroud) 什么是使用设置找到要捕获的图像分辨率的最佳方法AVCaptureSessionPresetPhoto.
我想在捕获图像之前找到分辨率.
我正在开发一个项目,我们将使用iPhone作为捕捉场景的摄像头.录制时我们需要录制@ 60fps而不是30fps(原生支持).所以我正在开发一个应用来做这个,因为iPhone 4S硬件支持720p @ 60fps(如果你越狱你的手机,你可以实现这一点).
有没有人知道如何在iOS上的Objective-C中做到这一点?今天我看到一个应用程序(slopro)可以在非越狱手机上录制60fps.任何建议或提示非常感谢.
我想在两个相互靠近的UIViews中显示iPad2的前置和后置摄像头的流.要流式传输一个设备的图像,我使用以下代码
AVCaptureDeviceInput *captureInputFront = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:nil];
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session addInput:captureInputFront];
session setSessionPreset:AVCaptureSessionPresetMedium];
session startRunning];
AVCaptureVideoPreviewLayer *prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];
prevLayer.frame = self.view.frame;
[self.view.layer addSublayer:prevLayer];
Run Code Online (Sandbox Code Playgroud)
这适用于任何一台相机.为了并行显示流,我尝试创建另一个会话,但是第二个会话建立后,第一个会话冻结.
然后我尝试向会话添加两个AVCaptureDeviceInput,但目前最多支持一个输入.
任何有用的想法如何从两个相机流?
我设法写了一些打开相机并预览视频的代码.我现在想要从输出捕获帧以发送到理想编码为H.264的服务器
这是我得到的:
import UIKit
import AVFoundation
class ViewController: UIViewController {
let captureSession = AVCaptureSession()
var previewLayer : AVCaptureVideoPreviewLayer?
// If we find a device we'll store it here for later use
var captureDevice : AVCaptureDevice?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
captureSession.sessionPreset = AVCaptureSessionPresetHigh
let devices = AVCaptureDevice.devices()
// Loop through all the capture devices on this phone
for device in devices {
// Make sure this particular …Run Code Online (Sandbox Code Playgroud) 我有以下代码适用于iOS 6和7.x.
在iOS 8.1中,我有一个奇怪的问题,如果你捕获会话大约13秒或更长时间,结果AVAsset只有1个轨道(视频),音频轨道就不存在.
如果您录制的时间较短,则AVAsset会有预期的2个音轨(视频和音频).我有足够的磁盘空间,该应用程序有权使用相机和麦克风.
我用最少的代码创建了一个新项目,它重现了这个问题.
任何想法将不胜感激.
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
enum RecordingState { Recording, Stopped };
enum RecordingState recordingState;
AVCaptureSession *session;
AVCaptureMovieFileOutput *output;
AVPlayer *player;
AVPlayerLayer *playerLayer;
bool audioGranted;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupAV];
recordingState = Stopped;
}
-(void)setupAV
{
session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
AVCaptureDevice *videoDevice = nil;
for ( AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] ) {
if ( device.position == AVCaptureDevicePositionBack ) {
videoDevice = device;
break; …Run Code Online (Sandbox Code Playgroud) 我正在开发一款操纵高清照片的应用程序.我正在用AVCaptureSession拍照,停止它然后对该照片应用效果.
令我疯狂的是,一切正常,仪器告诉我,我按时正确地释放了我使用的所有内存.它真的很高,有时达到100mb.但它迅速下降.
然后我重新开始我的捕获会话,我收到了内存警告.绝对没有理由; _; 我释放时使用的所有内存...然后下次我将重新启动捕获会话时应用程序崩溃.没有消息,没有日志,什么都没有.
我不知道如何解决这个问题,我不知道在哪里寻找...如果有人能帮助我一点点我会很高兴的!
提前致谢!
现在我正在使用RTMPStreamPublisherwowzaserver发布视频.它正在成功上传,但有人能告诉我如何在上传到服务器时将相同的视频存储在iPhone上吗?
我使用https://github.com/slavavdovichenko/MediaLibDemos,但没有太多可用的文档.如果我可以存储发送的数据,那么我的工作就会成功.
以下是他们用于上传流的方法,但我找不到在iPhone设备上存储相同视频的方法:
// ACTIONS
-(void)doConnect {
#if 0 // use ffmpeg rtmp
NSString *url = [NSString stringWithFormat:@"%@/%@", hostTextField.text, streamTextField.text];
upstream = [[BroadcastStreamClient alloc] init:url resolution:RESOLUTION_LOW];
upstream.delegate = self;
upstream.encoder = [MPMediaEncoder new];
[upstream start];
socket = [[RTMPClient alloc] init:host]
btnConnect.title = @"Disconnect";
return;
#endif
#if 0 // use inside RTMPClient instance
upstream = [[BroadcastStreamClient alloc] init:hostTextField.text resolution:RESOLUTION_LOW];
//upstream = [[BroadcastStreamClient alloc] initOnlyAudio:hostTextField.text];
//upstream = [[BroadcastStreamClient alloc] initOnlyVideo:hostTextField.text resolution:RESOLUTION_LOW];
#else // use outside RTMPClient instance
if …Run Code Online (Sandbox Code Playgroud) 我正在调用AVFoundation的委托方法来处理照片捕获,但是我很难将它生成的AVCapturePhoto转换为具有正确方向的UIImage.虽然下面的例程是成功的,但我总是得到一个面向右侧的UIImage(UIImage.imageOrientation = 3).使用UIImage(数据:图像)并尝试首先使用photo.cgImageRepresentation()时,我无法提供方向?takeRetainedValue()也没有帮助.请协助.
在此处,图像方向至关重要,因为生成的图像将被输入Vision框架工作流程.
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
// capture image finished
print("Image captured.")
if let imageData = photo.fileDataRepresentation() {
if let uiImage = UIImage(data: imageData){
// do stuff to UIImage
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新1: 阅读Apple的Photo Capture编程指南(iOS11过时),我确实找到了一件我做错的事情:

更新2 链接到GitHub上的完整项目:https://github.com/agu3rra/Out-Loud
avcapturesession ×10
ios ×7
iphone ×5
avcapture ×2
avfoundation ×2
camera ×2
objective-c ×2
frame-rate ×1
ios11 ×1
ios8.1 ×1
ipad ×1
ipad-2 ×1
preview ×1
recording ×1
rtmp ×1
stream ×1
swift ×1
swift4 ×1
video ×1
warnings ×1