• Страница 1 из 1
  • 1
Модератор форума: mrmerak, krivenchenko  
Форум » Кодирование аудио » Консольные кодеры » Выбор формата со сжатием для записи речи (Многочасовая запись и проблема точного поиска по времени)
Выбор формата со сжатием для записи речи
Aleks_V
Группа: Проверенные
Сообщений: 3
Статус: Оффлайн
Здравствуйте!

Есть потребность сделать приложение, которое могло бы писать звук в файл кусками примерно по 10 часов. И потом примерно +/- секунда быстро находить нужное место в аудиозаписи. Форматы без сжатия, к сожалению, не подходят.

Попробовал для начала запись в формат WMA 9.2 (встроен в W10) с постоянным битрейтом 96000 на протяжении около 14 часов, для проверки. Остановил запись точно по таймеру. Результирующий файл в плеере Windows длинее на 2 минуты с копейками. Я не знаток алгоритмов сжатия, подумал, что это происходит из-за того, что в процессе кадры дополняются какими-то псевдовыборками или чем-то в этом роде. Потом попробовал пописать ровно 9 часов, битрейт 128000 постоянный - запись в плеере короче на 15 секунд.

Попробовал OGG сжатие с постоянным битрейтом (во всех случаях источником было системное устройство, USB микрофон, через Direct X). Результат совсем поразил - на 30 минут записи около минуты разницы в результирующем файле.

Как думаете, есть ли перспективы в форматах со сжатием в моем случае? Может ли такое быть, что позиционирование и тайминг точнее, например, в случае MP3 с постоянным битрейтом (пока не проверял этот вариант, нужно несколько часов хотя бы) ?  Может, есть песрпективы MP3+что то типа CUE-файла с отметками раз в 10 минут например? Или нужно выдумывать что-то еще, например, писать во второй канал закодированные метки времени в виде тональных посылок, начинать скажем за полминуты до нужного времени, ускоренно проигрывать, с учетом изменения частоты декодировать, примерно определять нужный фрейм как-то... тоска короче. Хотя наверное и реально.

Да, пробовал писать через компоненты Delphi, поэтому трудно сказать, какие конкретно ключи там используются. Источник - через Direct X. Потом вызывается либо встроенный в Windows кодер WMA либо внешние dll (OGG, Lame...). Но можно, разумеется, задать битрейт, CBR (VBR) и в основном все.
Сообщение отредактировал Aleks_V - Понедельник, 01 Февраля 2021, 17:20
Audiophile
Группа: Администраторы
Сообщений: 1274
Статус: Оффлайн
Aleks_V, не совсем понятно, в чем проблема заключается. Вы включаете запись ровно на 14 часов, а получаете запись длиной 14 часов 2 минуты?
Надо выяснить, на каком этапе проблема возникает. Если есть возможность, запишите в PCM WAV для начала и посмотрите. Может дело в библиотеке или устройстве, или...
Или может это просто неправильно вычисляется длина записи в плеере.
В общем, сложно сказать. Слишком много неизвестных. Попробуйте на более коротких записях - 1 час например.

Я к сожалению на десктопе с программированием пока дела не имел.

А насчет выбора кодека - по-моему тут однозначно Opus будет лучшим.
Rollinnn
Группа: Эксперты
Сообщений: 1461
Статус: Оффлайн
Почему бы вместо того, чтобы изобретать велосипед, не использовать для записи ffmpeg, просто вызывая его из своего приложения с нужными параметрами? Тогда можно записывать хоть в несколько форматов сразу.
FLAC1.3.3NOSSE Opus1.3.1NOSSE LAME3.99.5ICL12.1 Monkey'sAudio4.10(NOSSE2) ffmpeg для Windows XP и процессоров без SSE2
Сообщение отредактировал Rollinnn - Понедельник, 01 Февраля 2021, 22:09
Aleks_V
Группа: Проверенные
Сообщений: 3
Статус: Оффлайн
Добрый вечер!

> не совсем понятно, в чем проблема заключается. Вы включаете запись ровно на 14 часов, а получаете запись длиной 14 часов 2 минуты?
Совершенно верно. Сначала я наивно полагал, что стоит взять смещение от начала файла, и я почти точно попаду в нужное место, будь это первый или скажем десятый час записи. На файлах покороче, пять часов например, в WMA не хватает 9 секунд. Немного, но неприятно. Такое ощущение, что внутри файла существует своя "система отсчета" Покурил эту тему - профи для синхронизации используют отдельную дорожку с линейным тайм-кодом. Думаю, может, сделать его в упрощенном виде. Однако, тут нужно еще учесть, сколько времени от момента по часам компьютера проходит до того времени, когда звук, который был в этот момент, станет частью закодированного файла. Но надеюсь, что в этом месте ошибка плюс-минус будет не очень большой. Т.е. тут в общем мешает ошибка, которая накапливается, а "мгновенной" можно и пренебречь.

Сам по себе ffmpeg мне кажется мало что даст. Надо конечно пробовать и MP3, и Opus, возможно и другие кодеки. В идеале, нужен какой-то кодек, который на многочасовых записях дает такую же длину, что и время записи, если это вообще возможно в форматах со сжатием. В чем я пока как раз еще и не разобрался. Кстати, еще момент - запись в WMA (он по сути часть Windows) стартует почти мгновенно. А вот в OGG как мне показалось, через внешние библиотеки, теряется секунды две от момента начала записи. С MP3 скорее всего будет тоже самое. Т.е. уже на старте мы получим лаг, который может еще и зависеть от конкретной машины.

И да, спасибо. Завтра буду пробовать и в WAV несколько часов. Может и правда, тут не только сжатие, в которое я пока уперся.

Добавлено (02 Февраля 2021, 22:34)
---------------------------------------------
Приветствую!  Пока продолжаю эксперименты с WMA. Результаты относительно обнадеживающие. Интересно, что нужно смотреть не на то время, которое показывают плееры, а на фактическое, по таймеру компьютера. Например, я знаю, что писал ровно 9 часов. А в свойствах файла длина другая - 8:59:45.  Всего - 1 428 181 146 отсчета.  Если это число разделить точно на число секунд в 9 часах, получим SampleRate 44079 на 1 секунду. Если плясать от этого  SampleRate, то почти попадаем в плеере +/- на нужную секунду, например, на 8 часов 59 минут и 10 секунд (там, перед окончанием записи, я считал в микрофон, поэтому проверить легко). На часовом файле (по свойствам он получился как 59:58)  SampleRate получился 44084. Тоже вроде позиционируется нормально. Нужно, конечно, еще проверить, в серединах файлов и прочее..
Сообщение отредактировал Aleks_V - Среда, 03 Февраля 2021, 08:50
Rollinnn
Группа: Эксперты
Сообщений: 1461
Статус: Оффлайн
Цитата Aleks_V ()
Сам по себе ffmpeg мне кажется мало что даст.
Зря Вам так кажется.
Попробовал записать ffmpeg'ом в разные форматы - mp3, vorbis, opus и FLAC. Запись с микрофона веб-камеры, подключённой по USB.
Из-за того, что редактор сообщений здесь работает как-то странно, вставить логи ffmpeg прямо в сообщение невозможно.

Вариант первый:
Код
ffmpeg -rtbufsize 2100M -f dshow -channels 1 -sample_size 16 -sample_rate 44100 -i audio="Mic (HD Webcam C270)" -vn -c:a flac -compression_level 12 "g:\aassaaaa.flac" -c:a libvorbis "g:\aassaaaa.ogg" -c:a libopus "g:\aassaaaa.opus" -c:a libmp3lame -aq 2 "g:\aassaaaa.mp3"
Лог ffmpeg - https://pastebin.com/j8ThVd9H
Смущает предупреждение [libvorbis @ 00b40e80] Queue input is backward in time. Но, похоже, что с иоговым файлом всё в порядке.
Время записи по логу ffmpeg - 05:03:12.91
Продолжительность файлов, которую определяет плеер foobar2000:
FLAC - 5:03:12.927
mp3 - 5:03:12.980
vorbis - 5:03:12.924
opus - 5:03:12.904
Фактическая продолжительность, определённая при проверке с помощью foo_verifier в фубаре:
FLAC - то же
mp3 - то же
vorbis - 5:03:12.999909
opus - 5:03:12.98
Файлы - https://yadi.sk/d/LCFSn6RIHFAqsw

Другой вариант:
Код
ffmpeg -rtbufsize 2100M -f dshow -channels 1 -sample_size 16 -sample_rate 44100 -i audio="Mic (HD Webcam C270)" -vn -f wv -compression_level 0 -|ffmpeg -i - -c:a libvorbis "g:\cock\aassaaaa.ogg" -c:a libopus "g:\cock\aassaaaa.opus" -c:a libmp3lame -aq 2 "g:\cock\aassaaaa.mp3"
Лог ffmpeg - https://pastebin.com/SzNNjVuL
Время записи по логу ffmpeg - 05:06:48.99
Продолжительность файлов, которую определяет плеер foobar2000:
mp3 - 5:06:49.000
vorbis - 5:06:49.000
opus - 5:06:49.000
Фактическая продолжительность определённая при проверке с помощью foo_verifier в фубаре:
mp3 - то же
vorbis - то же
opus - то же
Файлы - https://yadi.sk/d/IQJ6nXQ1R2-D0g

Как видите, когда всё работает нормально, ошибка ничтожно мала. И, кстати, она не зависит от общей продолжительности.
FLAC1.3.3NOSSE Opus1.3.1NOSSE LAME3.99.5ICL12.1 Monkey'sAudio4.10(NOSSE2) ffmpeg для Windows XP и процессоров без SSE2
Сообщение отредактировал Rollinnn - Четверг, 04 Февраля 2021, 01:21
Aleks_V
Группа: Проверенные
Сообщений: 3
Статус: Оффлайн
> Как видите, когда всё работает нормально, ошибка ничтожно мала. И, кстати, она не зависит от общей продолжительности.

Очень интересно, спасибо большое. Не совсем понятно только, вот это "Время записи по логу ffmpeg" как думаете, как он вычисляет продолжительность?  Может такое быть, что это "внутреннее" время ffmpeg?  Не знаю как лучше сказать. Я засекал по часам компьютера. Пробовал писать сегодня ровно 11 ч 30 мин. Результирующий файл короче на 15 секунд. Но если считать по 44085 в секунду  (число отсчетов поделить на фактическое время записи в секундах) то вроде не плохо получается попадать. Плюс-минус секунда точно. 

С другой строны, Вы пишете про foo_verifier в фубаре. Буду разбираться, наверняка он-то считает по времени компьютера. Т.е. получается, что ffmpeg намного точнее, чем WMA кодер в системе. Однако, часы в компьютере тоже тмеют конечную точность. На 10 часах может быть уход вполне заметный.  И, мне кажется, тут еще очень большое значение имеет "реактивность" кодека, как быстро он начинает кодировать, помещать в файл аудиоданные после отдачи ему команды и быстро прекращать запись. По моим ощущениям, у WMA это не более секунды, а реально пожалуй и менее.

Добавлено (08 Февраля 2021, 21:28)
---------------------------------------------
Добрый день!

Вот еще интересные результаты. Запись в файл WMA ровно четыре часа по таймеру. Писалась почти полная тишина, время разговора - несколько минут на протяжении всего файла. Время файла в плеерах показывается длиной - 3ч 48мин 32 сек!  Всего отсчетов - 604 739 772. Получается  - примерно 41996 в секунду!  Тут позиционирование похуже - в конце файла попадаю вперед на 2 секунды. Но в целом нормально.

Интересно, почему такое время и битрейт, как думаете?

Форум » Кодирование аудио » Консольные кодеры » Выбор формата со сжатием для записи речи (Многочасовая запись и проблема точного поиска по времени)
  • Страница 1 из 1
  • 1
Поиск: