Не могу воспроизвести системные звуки после захвата аудио / видео - PullRequest
0 голосов
/ 15 декабря 2011

Я записываю аудио / видео с помощью AVfoudnation. и мне нужно воспроизвести звуки, используя системные звуки, прежде чем я начну захватывать видео / аудио. Это работает правильно в первый раз, но когда я пытаюсь сделать это во второй раз, системная аудиозапись не воспроизводится. Я предполагаю, что что-то в AV-фонде не было выпущено правильно.

В моем удалении приложения у меня есть этот код в методе applicationDidFinishLaunching:

VKRSAppSoundPlayer *aPlayer = [[VKRSAppSoundPlayer alloc] init];
[aPlayer addSoundWithFilename:@"sound1" andExtension:@"caf"];
self.appSoundPlayer = aPlayer;
[aPlayer release];

, а также этот метод

- (void)playSound:(NSString *)sound
{
    [appSoundPlayer playSound:sound];
}

Как видите, я использую VKRSAppSoundPlayer, который прекрасно работает!

В представлении у меня есть этот код:

- (void) startSession
{
    self.session = [[AVCaptureSession  alloc] init];

    [session beginConfiguration];
    if([session canSetSessionPreset:AVCaptureSessionPreset640x480])
        session.sessionPreset =  AVCaptureSessionPresetMedium; 

    [session commitConfiguration];


    CALayer *viewLayer = [videoPreviewView layer];

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    captureVideoPreviewLayer.frame = viewLayer.bounds;

    [viewLayer addSublayer:captureVideoPreviewLayer];

    self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:[self frontFacingCameraIfAvailable] error:nil];
    self.audioInput = [AVCaptureDeviceInput deviceInputWithDevice:[self audioDevice] error:nil];

    if(videoInput){
        self.videoOutput = [[AVCaptureMovieFileOutput alloc] init];

        [session addOutput:videoOutput];
        //[videoOutput release];

        if([session canAddInput:videoInput]){
            //[session beginConfiguration];
            [session addInput:videoInput];

        }
        //[videoInput release];

        [session removeInput:[self audioInput]];
        if([session canAddInput:audioInput]){
            [session addInput:audioInput];
        }
        //[audioInput release];


        if([session canAddInput:audioInput])
            [session addInput:audioInput];


        NSLog(@"startRunning!");
        [session startRunning];  

        [self startRecording];


        if(![self recordsVideo])
            [self showAlertWithTitle:@"Video Recording Unavailable" msg:@"This device can't record video."];

    }
}

- (void) stopSession
{
    [session stopRunning];
    [session release];   
}


- (AVCaptureDevice *)frontFacingCameraIfAvailable
{
    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    AVCaptureDevice *captureDevice = nil;

    Boolean cameraFound = false;

    for (AVCaptureDevice *device in videoDevices)
    {
        NSLog(@"1 frontFacingCameraIfAvailable %d", device.position);
        if (device.position == AVCaptureDevicePositionBack){
            NSLog(@"1 frontFacingCameraIfAvailable FOUND");

            captureDevice = device;
            cameraFound = true;
            break;
        }
    }

    if(cameraFound == false){
        for (AVCaptureDevice *device in videoDevices)
        {
            NSLog(@"2 frontFacingCameraIfAvailable %d", device.position);
            if (device.position == AVCaptureDevicePositionFront){
                NSLog(@"2 frontFacingCameraIfAvailable FOUND");

                captureDevice = device;
                break;
            }
        }
    }

    return captureDevice;
}

- (AVCaptureDevice *) audioDevice
{
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio];
    if ([devices count] > 0) {
        return [devices objectAtIndex:0];
    }
    return nil;
}

- (void) startRecording
{
#if _Multitasking_
    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
    }
#endif

    [videoOutput startRecordingToOutputFileURL:[self generatenewVideoPath] 
                             recordingDelegate:self];
}

- (void) stopRecording
{
    [videoOutput stopRecording];

}

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput 
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL 
      fromConnections:(NSArray *)connections error:(NSError *)error
{
    NSFileManager *man = [[NSFileManager alloc] init];
    NSDictionary *attrs = [man attributesOfItemAtPath: [outputFileURL path] error: NULL];
    NSString *fileSize = [NSString stringWithFormat:@"%llu", [attrs fileSize]];


    // close this screen
    [self exitScreen];
}

-(BOOL)recordsVideo
{
    AVCaptureConnection *videoConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo 
                                                                   fromConnections:[videoOutput connections]];
    return [videoConnection isActive];
}

-(BOOL)recordsAudio
{
    AVCaptureConnection *audioConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeAudio 
                                                                   fromConnections:[videoOutput connections]];
    return [audioConnection isActive];
}

Если я сделаю [videoInput release]; и [аудиовход выпуска]; Я получил ошибку доступа. вот почему они закомментированы. Это может быть частью проблемы.

Если я попытаюсь воспроизвести системный звук n раз, он сработает, но если я сначала перейду к сценарию записи, он не будет работать после этого.

Есть идеи?

1 Ответ

0 голосов
/ 17 декабря 2011

Правильный способ выпуска AVCaptureSession заключается в следующем:

- (void) destroySession {

    // Notify the view that the session will end
    if ([delegate respondsToSelector:@selector(captureManagerSessionWillEnd:)]) {
        [delegate captureManagerSessionWillEnd:self];
    }

    // remove the device inputs
    [session removeInput:[self videoInput]];
    [session removeInput:[self audioInput]];

    // release
    [session release];

    // remove AVCamRecorder
    [recorder release];

    // Notify the view that the session has ended
    if ([delegate respondsToSelector:@selector(captureManagerSessionEnded:)]) {
        [delegate captureManagerSessionEnded:self];
    }
}

Если у вас возникли какие-то проблемы с выпуском (плохой доступ), я могу порекомендовать перенести ваш код из текущего «грязного» проекта в какой-то другой новый проект и устранить проблему там.

Когда у меня была похожая проблема, я просто делал это. Я поделился им на Github, этот проект может оказаться полезным: AVCam-CameraReleaseTest

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...