Мое приложение использует API-интерфейсы ffmpeg (avformat, avdevice и т. Д.), Чтобы открыть выбранный аудиовход для кодирования.Для аудиовходов, настроенных для 24-битного режима, я могу надежно открыть их в первый раз, но когда я закрою и снова открою этот вход позже, вызов avformat_open_input () завершится неудачно из-за того, что «аудиоформат не поддерживается».Мое тестирование показывает, что оно никогда не дает сбой в первый раз после запуска моего, и имеет только около 50% шансов на успех при повторном открытии.
Сбой происходит только тогда, когда я настраиваю свой аудиовход «Встроенный микрофон» для24-разрядное целое число16-разрядное целое и 32-разрядное число с плавающей точкой работают надежно.Изменение количества каналов и частоты дискретизации не имеет никакого эффекта.
Я прочитал документацию и вижу, что правильный способ освободить ресурсы после открытия - вызвать avformat_close_input.Единственный способ гарантировать успех - открыть вход только один раз.
Я написал тестовую программу для воссоздания этих сбоев.
int main() {
avdevice_register_all();
cout << "Running open audio test" << endl;
int i;
for(i = 0; i< 10; i++) {
AVDictionary* options = NULL;
AVInputFormat* inputFormat = av_find_input_format("avfoundation");
if (!inputFormat) {
cout << "avfoundation inputFormat=null" << endl;
}
AVFormatContext* formatContext = avformat_alloc_context();
int result = avformat_open_input(&formatContext, ":1", inputFormat, &options);
if (result < 0) {
char error[256];
av_strerror(result, error, sizeof(error));
cout << "result=" << result << " " << error << endl;
} else {
cout << "input opened successfully" << endl;
}
sleep(1);
avformat_close_input(&formatContext);
sleep(1);
}
return 0;
}
Я ожидаю, что основной циклуспешное выполнение каждый раз, но типичный вывод показывает высокую частоту отказов:
Выполнение открытого аудио теста
input opened successfully
[avfoundation @ 0x7fdeb281de00] audio format is not supported
result=-5 Input/output error
[avfoundation @ 0x7fdeb2001400] audio format is not supported
result=-5 Input/output error
[avfoundation @ 0x7fdeb2001400] audio format is not supported
result=-5 Input/output error
input opened successfully
input opened successfully
input opened successfully
[avfoundation @ 0x7fdeb2068800] audio format is not supported
result=-5 Input/output error
input opened successfully
input opened successfully
Я пытался увеличить время ожидания между закрытием и открытием до 5 секунд, но не увиделРазница в поведении.Во время работы этой программы я могу использовать MacOS Audio MIDI Setup, чтобы изменить конфигурацию входа микрофона и наблюдать за изменением выхода со всех успехов на случайные ошибки.
Источник сбоя https://github.com/FFmpeg/FFmpeg/blob/master/libavdevice/avfoundation.m#L672
Похоже, что avfoundation.m внутренне открывает входной поток и захватывает аудиокадр, чтобы определить формат, но иногда возвращаемое значение недопустимо, когда процесс ранее открыл и закрыл этот ввод.
AmЯ не закрываю ресурсы должным образом?Есть ли у меня проблемы с оборудованием, характерные для моего macbook?
Дополнительные сведения:
Протестировано MacBook Pro с MacOS Mojave 10.14.6 Протестировано с Ffmpeg 3.4.1, 4.0 и 4.1
list_devices:
[AVFoundation input device @ 0x7f80fff066c0] AVFoundation video devices:
[AVFoundation input device @ 0x7f80fff066c0] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7f80fff066c0] [1] Capture screen 0
[AVFoundation input device @ 0x7f80fff066c0] AVFoundation audio devices:
[AVFoundation input device @ 0x7f80fff066c0] [0] Behringer Duplex
[AVFoundation input device @ 0x7f80fff066c0] [1] Built-in Microphone
[AVFoundation input device @ 0x7f80fff066c0] [2] USB Audio CODEC