FMOD_DSP_PITCHSHIFT не работает для mp3 на iOS

Я пытался реализовать функцию для увеличения скорости звука без изменения его высоты тона и временной шкалы.

Я пытаюсь установить частоту канала на медленную или быструю скорость.

Затем используйте FMOD_DSP_PITCHSHIFT, чтобы исправить звуки высоты тона по умолчанию.

Я использовал звуковой файл формата wav для функции тестирования и сборки.

Я пытаюсь интегрировать ресурс продукта, звуковой файл которого был закодирован как MP3.

PITCHSHIFT DSP не работает на звуковом канале MP3. журнал консоли выглядит нормально, без исключений и ошибок.

Тот же проект и все настройки отлично работают в симуляторе iOS.

После некоторых исследований и экспериментов результаты показывают, что даже m4a отлично работает на iOS.

Интересно, это какой-то баг? или я что-то упустил при настройке. пример кода был основан на потоке воспроизведения проекта FMOD Sample.

`/*==============================================================================
Play Stream Example
Copyright (c), Firelight Technologies Pty, Ltd 2004-2015.

This example shows how to simply play a stream such as an MP3 or WAV. The stream
behaviour is achieved by specifying FMOD_CREATESTREAM in the call to 
System::createSound. This makes FMOD decode the file in realtime as it plays,
instead of loading it all at once which uses far less memory in exchange for a
small runtime CPU hit.
==============================================================================*/
#include "fmod.hpp"
#include "common.h"

int FMOD_Main()
{
    FMOD::System     *system;
    FMOD::Sound      *sound, *sound_to_play;
    FMOD::Channel    *channel = 0;
    FMOD_RESULT       result;
    FMOD::DSP        * pitch_shift;
    unsigned int      version;
    void             *extradriverdata = 0;
    int               numsubsounds;

    Common_Init(&extradriverdata);

    /*
        Create a System object and initialize.
    */
    result = FMOD::System_Create(&system);
    ERRCHECK(result);

    result = system->getVersion(&version);
    ERRCHECK(result);

    if (version < FMOD_VERSION)
    {
        Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION);
    }

    result = system->init(32, FMOD_INIT_NORMAL, extradriverdata);
    ERRCHECK(result);

    result = system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &pitch_shift);
    ERRCHECK(result);


    /*
        This example uses an FSB file, which is a preferred pack format for fmod containing multiple sounds.
        This could just as easily be exchanged with a wav/mp3/ogg file for example, but in this case you wouldnt need to call getSubSound.
        Because getNumSubSounds is called here the example would work with both types of sound file (packed vs single).
    */
    result = system->createSound(Common_MediaPath("aaa.m4a"), FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound);
    ERRCHECK(result);

    result = sound->getNumSubSounds(&numsubsounds);
    ERRCHECK(result);

    if (numsubsounds)
    {
        sound->getSubSound(0, &sound_to_play);
        ERRCHECK(result);
    }
    else
    {
        sound_to_play = sound;
    }

    /*
        Play the sound.
    */
    result = system->playSound(sound_to_play, 0, false, &channel);
    ERRCHECK(result);
    result = channel->addDSP(0, pitch_shift);
    ERRCHECK(result);
            float        pitch = 1.f;
    result = pitch_shift->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, pitch);
    ERRCHECK(result);
    pitch_shift->setActive(true);
    ERRCHECK(result);
    float defaultFrequency;
    result = channel->getFrequency(&defaultFrequency);
    ERRCHECK(result);
    /*
        Main loop.
    */
    do
    {
        Common_Update();

        if (Common_BtnPress(BTN_ACTION1))
        {
            bool paused;
            result = channel->getPaused(&paused);
            ERRCHECK(result);
            result = channel->setPaused(!paused);
            ERRCHECK(result);
        }
        if (Common_BtnPress(BTN_DOWN)) {
            char valuestr;
            int valuestrlen;
            pitch_shift->getParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, &pitch, &valuestr, valuestrlen);
            pitch+=0.1f;
            pitch = pitch>2.0f?2.0f:pitch;
            pitch_shift->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, pitch);
            channel->setFrequency(defaultFrequency/pitch);

        }
        if (Common_BtnPress(BTN_UP)) {
            char valuestr;
            int valuestrlen;
            pitch_shift->getParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, &pitch, &valuestr, valuestrlen);
            pitch-=0.1f;
            pitch = pitch<0.5f?0.5f:pitch;
            pitch_shift->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, pitch);
            channel->setFrequency(defaultFrequency/pitch);
        }

        result = system->update();
        ERRCHECK(result);

        {
            unsigned int ms = 0;
            unsigned int lenms = 0;
            bool         playing = false;
            bool         paused = false;

            if (channel)
            {
                result = channel->isPlaying(&playing);
                if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
                {
                    ERRCHECK(result);
                }

                result = channel->getPaused(&paused);
                if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
                {
                    ERRCHECK(result);
                }

                result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
                if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
                {
                    ERRCHECK(result);
                }

                result = sound_to_play->getLength(&lenms, FMOD_TIMEUNIT_MS);
                if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE))
                {
                    ERRCHECK(result);
                }
            }

            Common_Draw("==================================================");
            Common_Draw("Play Stream Example.");
            Common_Draw("Copyright (c) Firelight Technologies 2004-2015.");
            Common_Draw("==================================================");
            Common_Draw("");
            Common_Draw("Press %s to toggle pause", Common_BtnStr(BTN_ACTION1));
            Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT));
            Common_Draw("");
            Common_Draw("Time %02d:%02d:%02d/%02d:%02d:%02d : %s", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped");
            Common_Draw("Pitch %02f",pitch);
        }

        Common_Sleep(50);
    } while (!Common_BtnPress(BTN_QUIT));

    /*
        Shut down
    */
    result = sound->release();  /* Release the parent, not the sound that was retrieved with getSubSound. */
    ERRCHECK(result);
    result = system->close();
    ERRCHECK(result);
    result = system->release();
    ERRCHECK(result);

    Common_Close();

    return 0;
}

`


person Matthew    schedule 08.05.2015    source источник


Ответы (1)


После еще нескольких экспериментов я могу добраться до места назначения, переключив формат звукового файла на m4a на устройстве iOS. MP3 по-прежнему не работает.

person Matthew    schedule 08.05.2015
comment
Проблема решена, дело не в формате. просто потому, что устройство iOS без наушников рассматривалось как 1-канальное. Таким образом, FMOD_DSP_PITCHSHIFT инициализирует себя как 1-канальное, тогда 2-канальный звук не может быть правильно обработан. используйте этот код после инициализации DSP. - person Matthew; 09.05.2015