Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVPlayer播放单声道音频立体声->;单声道_Ios_Cocoa Touch_Core Audio_Avplayer - Fatal编程技术网

Ios AVPlayer播放单声道音频立体声->;单声道

Ios AVPlayer播放单声道音频立体声->;单声道,ios,cocoa-touch,core-audio,avplayer,Ios,Cocoa Touch,Core Audio,Avplayer,在我的iPad/iPhone应用程序中,我正在使用AVPlayer播放视频。视频文件有一个立体声音轨,但我只需要在单声道播放这首歌的一个频道。部署目标是iOS 6。我怎样才能做到这一点?非常感谢您的帮助。我现在终于找到了这个问题的答案——至少是在iOS 6上的部署。您可以轻松地将MTAudioProcessingTap添加到现有的AVPlayer项目中,并在进程回调函数期间将选定的频道示例复制到其他频道。下面是一个很好的教程,介绍了基本知识: 这是我到目前为止的代码,大部分是从上面的链接复制的

在我的iPad/iPhone应用程序中,我正在使用AVPlayer播放视频。视频文件有一个立体声音轨,但我只需要在单声道播放这首歌的一个频道。部署目标是iOS 6。我怎样才能做到这一点?非常感谢您的帮助。

我现在终于找到了这个问题的答案——至少是在iOS 6上的部署。您可以轻松地将MTAudioProcessingTap添加到现有的AVPlayer项目中,并在进程回调函数期间将选定的频道示例复制到其他频道。下面是一个很好的教程,介绍了基本知识:

这是我到目前为止的代码,大部分是从上面的链接复制的

在AVPlayer设置期间,我为音频处理分配回调函数:

MTAudioProcessingTapCallbacks callbacks;
callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
callbacks.clientInfo = ( void *)(self);
callbacks.init = init;
callbacks.prepare = prepare;
callbacks.process = process;
callbacks.unprepare = unprepare;
callbacks.finalize = finalize;

MTAudioProcessingTapRef tap;
// The create function makes a copy of our callbacks struct
OSStatus err = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks,
                                          kMTAudioProcessingTapCreationFlag_PostEffects, &tap);
if (err || !tap) {
    NSLog(@"Unable to create the Audio Processing Tap");
    return;
}
assert(tap);

// Assign the tap to the input parameters
audioInputParam.audioTapProcessor = tap;

// Create a new AVAudioMix and assign it to our AVPlayerItem
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = @[audioInputParam];
playerItem.audioMix = audioMix;
以下是音频处理功能(实际上,process是唯一需要的功能):


嘿,正在寻找一种解决方案,在一个耳机频道上播放TTS声音。你的代码可能会有帮助,或者你有什么建议吗?嗨,本,我刚刚编辑了我的答案并添加了我的源代码。希望它能帮助你。有人知道你会如何用Swift写这篇文章吗。似乎无法使其工作?您好,在包含tap处理器的对象之后,我无法正确地释放tap处理器,请在此处查看我的问题:。
#pragma mark Audio Processing

void init(MTAudioProcessingTapRef tap, void *clientInfo, void **tapStorageOut) {
    NSLog(@"Initialising the Audio Tap Processor");
    *tapStorageOut = clientInfo;
}

void finalize(MTAudioProcessingTapRef tap) {
    NSLog(@"Finalizing the Audio Tap Processor");
}

void prepare(MTAudioProcessingTapRef tap, CMItemCount maxFrames, const AudioStreamBasicDescription *processingFormat) {
    NSLog(@"Preparing the Audio Tap Processor");
}

void unprepare(MTAudioProcessingTapRef tap) {
    NSLog(@"Unpreparing the Audio Tap Processor");
}

void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames,
         MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut,
         CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut) {
    OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, flagsOut, NULL, numberFramesOut);
    if (err) NSLog(@"Error from GetSourceAudio: %ld", err);

    SIVSViewController* self = (SIVSViewController*) MTAudioProcessingTapGetStorage(tap);

    if (self.selectedChannel) {

        int channel = self.selectedChannel;

        if (channel == 0) {
            bufferListInOut->mBuffers[1].mData = bufferListInOut->mBuffers[0].mData;
        } else {
            bufferListInOut->mBuffers[0].mData = bufferListInOut->mBuffers[1].mData;
        }
    }
}