Как я могу отследить помехи между библиотеками флаттера audo_recorder и стерео - PullRequest
0 голосов
/ 04 июня 2018

Я создаю приложение с Flutter, которое позволяет мне записывать аудио, а затем воспроизводить его позже.Я использую пакет audio_recorder 0.4.0 для записи звука и пакет stereo 1.0.0 для воспроизведения звука.

Когда я записываю с помощью симулятора iOS, все работает нормально.Но когда я запускаю на физическом устройстве (iPhone 6 Plus), я всегда получаю 28-байтовый файл в конце сеанса записи - в основном, просто заголовок файла m4a.

Я отследил эток какому-то вмешательству между двумя библиотеками.Я могу записать на физическое устройство просто отлично, если я использую пример приложения, включенного в audio_recorder 0.4.0.Но все, что мне нужно сделать, это добавить строку stereo: 1.0.0 к зависимостям в pubspec.yml того же примера проекта, и внезапно я начинаю получать 28-байтовые файлы на физическом устройстве в конце сеанса записи вместо обычного размера.Файл m4a.

У меня есть вопрос, состоящий из двух частей:

  1. Какого рода помехи может вызывать библиотека stereo для такого рода сбоя в audio_recorder библиотека?Я подозревал, что помехи в канале, но моя попытка изолировать это ничего не дала.

  2. Как я могу найти причину этого?

Я изучил вывод консоли с обеих сессий.Когда происходит сбой, я вижу несколько (8) из этих строк на выходе консоли сразу после попытки начать запись:

mediaserverd    1111: AudioConverterNew returned -50

Другие считают, что эта ошибка возникает, когда нет доступного микрофона.

Я также вижу эту подозрительную разницу между выходами.Когда запись прерывается:

default 11:36:57.098825 -0700   mediaserverd    4414: { "action":"set_play_state", "session":{"ID":"0x3315820","PID":14591,"name":"Runner"}, "details":"entry" }
default 11:36:57.100484 -0700   mediaserverd    -CMSessionMgr- cmsSetIsPlaying: CMSession: 'sid:0x3315820, Runner(14591), 'prim'' with [MediaPlayback/Default] [NonMixable] [System Audio] starting playing.
default 11:36:57.104699 -0700   mediaserverd    CAReportingClient.mm:328:-[CAReportingClient sendMessage:category:type:reporters:]: message {
    Volume = "0.75";
    VolumeCategory = "Audio/Video";
    VolumeOperationProcess = "com.monkela.audioRecordSample";
    VolumeOperationTime = 576708;
    VolumePlayingState = 1;
}: (
    857014545
)
default 11:36:57.105879 -0700   mediaserverd    -CMVAEndptMgr- vaemSetDeviceVolume: CMSession: Setting cmsvolume = 0.750 for device ID: VirtualAudioDevice_Default
default 11:36:57.107295 -0700   mediaserverd    VirtualAudio_Device.cpp:2046:SetPropertyData: [volm/outp/0] on device [ type: vdef; id: 354; addr: 0x1014e1ba0; hidden: 0; VA strms: { o/883/0x106fc5980 }; agg dev: [ id: 872; addr: 0x106f1a460; uid: "VAD [vdef] AggDev 52"; virt strms: {  }; phys devs: { [ id: 292; addr: 0x104b0fdb0; uid: "Speaker"; streams: { i/294/0x104b11cd0, o/293/0x104b12790 } ] } ] ]: 0.750000.
default 11:36:57.108123 -0700   mediaserverd    OutputVolumeControl_HAL_Common.cpp:662:CommitVolume: Setting Volume = -14.500000 dB, Final HW Volume = 0.000000 dB, Final SW Volume = -14.500000 dB, External Volume Handler: No
default 11:36:57.109008 -0700   mediaserverd    OutputVolumeControl_HAL_Common.cpp:663:CommitVolume:     PhysicalDevice UID = "Speaker"
default 11:36:57.109721 -0700   mediaserverd    OutputVolumeControl_HAL_Common.cpp:664:CommitVolume:     Scope = 1869968496 ("outp")
default 11:36:57.110704 -0700   mediaserverd    OutputVolumeControl_HAL_Common.cpp:665:CommitVolume:     Element = 0 ("0")
default 11:36:57.112062 -0700   mediaserverd    OutputVolumeControl_HAL_Common.cpp:698:CommitVolume:     SW Volume: 0.750000 scalar
default 11:36:57.114393 -0700   mediaserverd    VirtualAudio_Device.cpp:2066:SetPropertyData: Client request to set nominal sample rate to 44100.000000 on VAD 354.
default 11:36:57.116038 -0700   assertiond  [Runner:14591] Attempting to acquire assertion for Runner:14591: <BKProcessAssertion: 0x101349110; "CMSession.14591."com.monkela.audioRecordSample"."MediaPlayback".isPlayingProcessAssertion" (audio:inf); id:…C74721DE1F95>
default 11:36:57.116572 -0700   assertiond  [Runner:14591] Add assertion: <BKProcessAssertion: 0x101349110; id: 13077-914DDDE2-35CE-4420-85ED-C74721DE1F95; name: CMSession.14591."com.monkela.audioRecordSample"."MediaPlayback".isPlayingProcessAssertion; state: active; reason: audio; duration: infs> {
    owner = <BSProcessHandle: 0x101009be0; mediaserverd:13077; valid: YES>;
    flags = preventSuspend, preventThrottleDownCPU, preventIdleSleep, preventSuspendOnSleep;
}

Когда запись работает:

default 11:39:19.865022 -0700   mediaserverd    2863: { "action":"activate", "session":{"ID":"0x3315826","PID":14609,"name":"Runner"}, "details":"entry" }
default 11:39:19.880637 -0700   mediaserverd    CAReportingClient.mm:328:-[CAReportingClient sendMessage:category:type:reporters:]: message {
    "active devices" = "[ { vdef, [  ], [ pspk ( 0 ) ] }, { vspd, [ pmbi ( 0 ) ], [  ] }, { vcal, [ pdln ( 0 ) ], [ puln ( 0 ) ] } ]";
    category = csav;
    "going_active" = 1;
    mode = imdf;
    "staying_active" = 0;
}: (
    857014546
)

Вывод, когда запись прерывается, предполагает, что моя попытка начать запись фактически начинает что-то воспроизводить (т. Е. Вызывать неправильную запись)библиотека).

1 Ответ

0 голосов
/ 07 июня 2018

Я отыскал это и выяснил, как заставить библиотеки работать вместе, изменив пакет stereo.Оказывается, пакет stereo активировал сеанс воспроизведения аудио в application didFinishLaunchingWithOptions.По сути, эти строки:

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
[session setActive:YES error:&error];

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

Я не уверен, почему она работала в симуляторе.Каким-то образом симулятор должен иметь возможность одновременно выполнять сеанс воспроизведения и записи.

ОБНОВЛЕНИЕ: автор пакета stereo принял мой запрос на извлечение, если у вас есть версия 1.0.1 пакета, вы должны быть в состоянии избежать этой проблемы помехи.

...