【问题标题】:AVAssetWriter / AVAudioPlayer Conflict?AVAssetWriter / AVAudioPlayer 冲突?
【发布时间】:2011-07-23 21:12:41
【问题描述】:

几周前,我发布了这个关于我在使用 AVAssetWriter 时遇到的问题的帖子:AVAssetWriter Woes

进一步的研究似乎导致在使用 AVAudioPlayer 或实际上任何音频系统播放音频时使用 AVAssetWriter 的冲突。我也尝试过使用 OpenAL。

这是背景:

  • 使用 AVAssetWriter 将帧从一个图像或一组图像写入视频可以正常工作,直到调用 [AVAudioPlayer play]。

  • 这只会发生在设备上,不会发生在 SIM 卡上。

  • 尝试从 CVPixelBufferPoolCreatePixelBuffer 创建像素缓冲区时发生错误。

  • 音频开始播放后,之前存在的 AVAssetWriterInputPixelBufferAdaptor.pixelBufferPool 突然变为 nil。

您可以在这里下载代表项目:http://www.mediafire.com/?5k7kqyvtbfdgdgv

注释掉 AVAudioPlayer 播放,它将在设备上运行。

感谢任何线索。

【问题讨论】:

    标签: iphone ios audio avaudioplayer avassetwriter


    【解决方案1】:

    我已经找到了解决这个问题的方法。

    如果您想让 AVAudioPlayer 和 AVAssetWriter 一起正常运行,您必须拥有“可混合”的音频会话类别。

    您可以使用可混合的类别,例如 AVAudioSessionCategoryAmbient。

    但是,我需要使用 AVAudioSessionCategoryPlayAndRecord。

    您可以通过实现此功能将任何类别设置为可混合:

    OSStatus propertySetError = 0;
    
    UInt32 allowMixing = true;
    
    propertySetError = AudioSessionSetProperty (
                           kAudioSessionProperty_OverrideCategoryMixWithOthers,  // 1
                           sizeof (allowMixing),                                 // 2
                           &allowMixing                                          // 3
                       );
    

    【讨论】:

      【解决方案2】:

      以上答案是完整的。它不起作用。改为这样做

      // Setup to be able to record global sounds (preexisting app sounds)
          NSError *sessionError = nil;
          if ([[AVAudioSession sharedInstance] respondsToSelector:@selector(setCategory:withOptions:error:)])
              [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDuckOthers error:&sessionError];
          else
              [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
      
          // Set the audio session to be active
          [[AVAudioSession sharedInstance] setActive:YES error:&sessionError];
      
      //then call your asset writer 
      movieWriter = [[AVAssetWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 2011-11-22
        • 2016-02-25
        • 2011-08-04
        相关资源
        最近更新 更多