Возвращает продолжительность указанной аудиозаписи в секундах.
Синтаксис
ПолучитьПродолжительностьАудио(<Аудио>)Полное описание, параметры и ограничения
СредстваМультимедиа.ПолучитьПродолжительностьАудио (MultimediaTools.GetAudioDuration)
СредстваМультимедиа (MultimediaTools)
ПолучитьПродолжительностьАудио (GetAudioDuration)
Доступен, начиная с версии 8.3.9.
Синтаксис:
ПолучитьПродолжительностьАудио(<Аудио>)
Параметры:
<Аудио> (обязательный)
Тип: ДанныеМультимедиа, ДвоичныеДанные, Строка.
Данные аудиозаписи в памяти в виде объекта ДанныеМультимедиа, ДвоичныеДанные, либо путь к аудиофайлу в файловой системе.
На iOS и Android в качестве пути может принимать ссылку со схемой "content:" на аудиофайл в мультимедиа библиотеке.
Если двоичные данные не содержат аудиозапись в поддерживаемом формате или указан путь не к аудиофайлу, будет сгенерировано исключение "Невозможно определить продолжительность аудиозаписи".
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает продолжительность указанной аудиозаписи в секундах.
Доступность:
Мобильный клиент, мобильное приложение (клиент).
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Мобильная аудиозапись: свой микрофон, реальная длительность и остановка
Полный модуль своего автономного мобильного Пульта: мобильная аудиозапись: свой микрофон, реальная длительность и остановка. Подготовка, действительные источники данных, отмена, границы контекста и контроль результата описаны отдельно.
Где и как запускать
Полный модуль управляемой формы Пульт собственного автономного мобильного приложения УчебноеМультимедиа85; здесь не выполнялся.
Подготовка
Создать НОВУЮ отдельную конфигурацию УчебноеМультимедиа85 для автономного мобильного приложения8.5.1.1343; совместимость Не использовать. Не рабочую базу. Для опытов нужен свой Android/iOS и соответствующая мобильная платформа, не Windows desktop и не подключенный мобильный клиент.
Конфигуратор → Обработки → УчебноеМультимедиа85 → Формы → Пульт: управляемая форма. Вставить ВЕСЬ модуль только одного урока. Его ПриОткрытии и ПередЗакрытием назначить событиям формы через конструктор. ПриОткрытии имеет Отказ; ПередЗакрытием — четыре аргумента Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка.
Реквизиты формы: Согласие — Булево, начальное значение Ложь; Итог — Строка неограниченной длины, многострочное поле только просмотра. Для камеры/документов дополнительно Предпросмотр — Картинка и поле картинки с этим путем к данным.
Создать команды ЗаписатьЧерезОкно, ЗаписатьВФоне, ОстановитьЗапись, Прослушать, ОстановитьЗвук, действия с точно теми же именами и кнопки. У поля Согласие назначить событие ПриИзменении обработчику СогласиеПриИзменении.
Для штрихкодового урока добавить РазрешенныйКод — Строка длины13 и поле ввода; до открытия сканера вписать цифры своей реальной упаковки. Для остальных уроков реквизит не нужен.
Сохранить свою конфигурацию, проверить и обновить собственную базу (F7). Включить требуемую функциональность мобильного приложения — камеру/микрофон для выбранного урока — и развернуть только собственный учебный пакет на своем устройстве обычным для вашей мобильной платформы способом. Здесь сборка пакета, установка и F7 не выполнялись.
На устройстве самостоятельно дать нужные разрешения ОС только перед своим опытом. Согласие на форме не заменяет разрешение ОС. Снимать только свою бумагу/упаковку, записывать свою короткую фразу; не чужие лица, разговоры, документы или экран.
Весь модуль содержит проверенные ветви препроцессора: мобильные API только в МобильноеПриложениеКлиент, имя базы — только в МобильноеПриложениеСервер. Проверка базы локальная для автономного приложения, не сетевой сервер. API также существует у мобильного клиента, но этот конкретный стенд намеренно автономный.
runtimeVerifiedScenarios=0. Проверена только установленная справка и исходный HTML/код. Камера, микрофон, голос, устройство, 1С и ОС-разрешения здесь не запускались; новых резервных копий не создано.
#Если МобильноеПриложениеКлиент Тогда
Перем СвойЗапуск, СвояОперация, СвояГотовность;
Перем СвояЗапись, СвояДлительность;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СвойЗапуск = Неопределено;
СвояОперация = "";
СвояГотовность = Ложь;
Согласие = Ложь;
Итог = "Установите согласие только перед собственным опытом";
Попытка
ПроверитьСвойМобильныйСтендНаСервере();
Если ТипЗнч(СредстваМультимедиа) <> Тип("СредстваМультимедиа") Тогда
ВызватьИсключение "Нужен реальный глобальный мобильный объект мультимедиа";
КонецЕсли;
СвояГотовность = Истина;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
Если СвояОперация <> "" Тогда
Отказ = Истина;
ТекстПредупреждения = "Сначала завершите только свой опыт: " + СвояОперация;
Если Не ЗавершениеРаботы Тогда
Сообщить(ТекстПредупреждения);
КонецЕсли;
Возврат;
КонецЕсли;
СвояГотовность = Ложь;
СвойЗапуск = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоеСогласие()
Если Не СвояГотовность Или Не Согласие Тогда
ВызватьИсключение "Нужны открытое собственное окно и явное согласие на этот опыт";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция НачатьСвойОпыт(Операция)
ПроверитьСвоеСогласие();
Если СвояОперация <> "" Тогда
ВызватьИсключение "Не запускайте второй собственный опыт до завершения первого";
КонецЕсли;
СвойЗапуск = Новый УникальныйИдентификатор;
СвояОперация = Операция;
Итог = Операция;
Возврат СвойЗапуск;
КонецФункции
&НаКлиенте
Функция ЭтоСвойОпыт(Запуск)
Возврат СвояГотовность И СвойЗапуск <> Неопределено И Запуск = СвойЗапуск;
КонецФункции
&НаКлиенте
Процедура ЗавершитьСвойОпыт(Запуск)
Если ЭтоСвойОпыт(Запуск) Тогда
СвойЗапуск = Неопределено;
СвояОперация = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьЧерезОкно(Команда)
Запуск = НачатьСвойОпыт("Окно аудиозаписи");
СвояЗапись = Неопределено;
СвояДлительность = 0;
Попытка
Если Не СредстваМультимедиа.ПоддерживаетсяАудиозапись() Тогда
ВызватьИсключение "Аудиозапись устройством не поддерживается";
КонецЕсли;
Запись = СредстваМультимедиа.СделатьАудиозапись(, Ложь, Ложь);
ПринятьСвоюЗапись(Запись);
ЗавершитьСвойОпыт(Запуск);
Исключение
ЗавершитьСвойОпыт(Запуск);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьВФоне(Команда)
Запуск = НачатьСвойОпыт("Фоновая аудиозапись");
СвояЗапись = Неопределено;
СвояДлительность = 0;
Попытка
Если Не СредстваМультимедиа.ПоддерживаетсяАудиозапись() Тогда
ВызватьИсключение "Аудиозапись устройством не поддерживается";
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("СвояЗаписьЗавершена", ЭтаФорма, Запуск);
СредстваМультимедиа.ВключитьАудиозапись(Оповещение);
Исключение
ЗавершитьСвойОпыт(Запуск);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьЗапись(Команда)
Если СвояОперация = "Фоновая аудиозапись" И СвойЗапуск <> Неопределено Тогда
СредстваМультимедиа.ОтключитьАудиозапись();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СвояЗаписьЗавершена(РезультатАудиозаписи, ДополнительныеПараметры) Экспорт
Если Не ЭтоСвойОпыт(ДополнительныеПараметры) Тогда
Возврат;
КонецЕсли;
ЗавершитьСвойОпыт(ДополнительныеПараметры);
Если Не Согласие Тогда
Итог = "Результат не принят: согласие снято";
Возврат;
КонецЕсли;
ПринятьСвоюЗапись(РезультатАудиозаписи);
КонецПроцедуры
&НаКлиенте
Процедура ПринятьСвоюЗапись(Запись)
Если Не Согласие Тогда
Итог = "Результат не принят: согласие снято";
Возврат;
КонецЕсли;
Если Запись = Неопределено Тогда
Итог = "Запись отменена; старый результат не используется";
Возврат;
КонецЕсли;
Если ТипЗнч(Запись) <> Тип("ДанныеМультимедиа") Тогда
ВызватьИсключение "Нужна аудиозапись, реально возвращенная платформой";
КонецЕсли;
Длительность = СредстваМультимедиа.ПолучитьПродолжительностьАудио(Запись);
Если ТипЗнч(Длительность) <> Тип("Число") Или Длительность <= 0 Тогда
ВызватьИсключение "Полученная запись должна иметь настоящую положительную длительность";
КонецЕсли;
СвояЗапись = Запись;
СвояДлительность = Длительность;
Итог = "Собственная запись: " + Строка(Длительность) + " секунд; " + Запись.ТипСодержимого;
КонецПроцедуры
&НаКлиенте
Процедура Прослушать(Команда)
Если СвояЗапись = Неопределено Или СвояДлительность <= 0 Тогда
ВызватьИсключение "Сначала запишите собственную короткую фразу";
КонецЕсли;
Запуск = НачатьСвойОпыт("Прослушивание");
Попытка
Оповещение = Новый ОписаниеОповещения("СвоеПрослушиваниеОстановлено", ЭтаФорма, Запуск);
СредстваМультимедиа.ВоспроизвестиАудио(СвояЗапись, 0, Оповещение, Ложь);
Исключение
ЗавершитьСвойОпыт(Запуск);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СвоеПрослушиваниеОстановлено(ТекущаяПозиция, Дополнительно) Экспорт
Если Не ЭтоСвойОпыт(Дополнительно) Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ТекущаяПозиция) <> Тип("Число") Или ТекущаяПозиция < 0 Тогда
ВызватьИсключение "Платформа должна вернуть действительную позицию собственного аудио";
КонецЕсли;
Итог = "Остановка или прерывание на " + Строка(ТекущаяПозиция) + " секунде; завершите свой сеанс кнопкой ОстановитьЗвук";
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьЗвук(Команда)
Если СвояОперация = "Прослушивание" И СвойЗапуск <> Неопределено Тогда
Запуск = СвойЗапуск;
СредстваМультимедиа.ОстановитьВоспроизведениеАудио();
ЗавершитьСвойОпыт(Запуск);
Итог = "Собственное прослушивание завершено";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СогласиеПриИзменении(Элемент)
Если Не Согласие Тогда
Если СвояОперация = "Фоновая аудиозапись" Тогда
ОстановитьЗапись(Неопределено);
ИначеЕсли СвояОперация = "Прослушивание" Тогда
ОстановитьЗвук(Неопределено);
КонецЕсли;
СвояЗапись = Неопределено;
СвояДлительность = 0;
КонецЕсли;
КонецПроцедуры
#Иначе
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Отказ = Истина;
Сообщить("Откройте свою отдельную автономную мобильную базу УчебноеМультимедиа85, не desktop или подключенный мобильный клиент");
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Отказ = Ложь;
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СогласиеПриИзменении(Элемент)
Согласие = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьЧерезОкно(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьВФоне(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьЗапись(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
&НаКлиенте
Процедура Прослушать(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
&НаКлиенте
Процедура ОстановитьЗвук(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
#КонецЕсли
&НаСервереБезКонтекста
Процедура ПроверитьСвойМобильныйСтендНаСервере()
#Если МобильноеПриложениеСервер Тогда
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Собственный опыт не запускается внутри чужой транзакции";
КонецЕсли;
#Иначе
ВызватьИсключение "Этот стенд требует локального сервера автономного мобильного приложения";
#КонецЕсли
КонецПроцедурыРазбор по шагам
После согласия записать свою короткую фразу через встроенное окно. НачатьЗаписьСразу=Ложь: пользователь сам нажимает запись. Отмена возвращает Неопределено, прежняя запись предварительно сброшена.
Проверка ПоддерживаетсяАудиозапись не гарантирует разрешение ОС или свободный микрофон. Ошибка запуска освобождает только свой токен и не маскируется сообщением об успехе.
Для фонового варианта сначала назначить GUID сеанса, затем ОписаниеОповещения с этим GUID. Публичный обработчик получает два аргумента: реальные ДанныеМультимедиа/Неопределено и дополнительные параметры.
Нажать ОстановитьЗапись или собственную кнопку платформы через3–5 секунд. Пока результат не пришел, второй опыт и закрытие формы блокируются. После callback чужого/старого GUID данные не принимаются.
ПолучитьПродолжительностьАудио вызывается именно для собственной записи платформы, не фиктивных байтов. Положительное число секунд и MIME выводятся в Итог; фиксированные5 секунд не выдаются за измеренный результат.
Прослушать начинает с позиции0 и не разрешает фон. Callback возвращает реальную числовую позицию остановки/прерывания. Он не сообщает причину и может сработать при уведомлении с дальнейшим возобновлением: свой сеанс сохраняется до кнопки ОстановитьЗвук.
Снять согласие во время фоновой записи/прослушивания: обработчик остановит только собственную операцию, удалит ссылки формы на запись и не примет результат без согласия. Это не удаление временного кэша ОС.
Как проверить результат
Будущий ручной запуск должен получить настоящий результат выбранного API на своем устройстве и пройти условия своего урока. Положительный флаг поддержки или отсутствие исключения само по себе не означает, что данные получены.
Без согласия новая операция должна отказать. Отмена должна оставлять отмену, а ошибка запуска — ошибку; второе нажатие не должно подменять активный GUID собственного опыта.
Проверьте отдельный отрицательный опыт по шагам урока: отсутствие голосового пакета, отмену захвата, чужой код или низкое качество/лишнюю страницу. Не подставляйте фиктивный объект или ожидаемые байты вместо результата платформы.
После освобождения собственного сеанса форму можно закрыть. При собственном активном сеансе ПередЗакрытием должен предложить сначала завершить его; поздний callback другого GUID не должен изменить Итог.
runtimeVerifiedScenarios=0. Все аппаратные результаты, ошибки и проверки здесь — условия будущей ручной приемки, а не выполненный тест1С.
Ожидаемый результат
Подготовлен самостоятельный мобильный урок с собственным сеансом и действительными результатами платформы; аппаратно здесь не запускался.
На что обратить внимание
СредстваМультимедиа — глобальное readonly-свойство мобильного контекста. Не создавать этот объект через Новый, не передавать неизвестный ИсходныйОбъект и не переносить вызовы в серверный/desktop-код.
Этот полный стенд рассчитан на автономное мобильное приложение. Серверная проверка имени конфигурации работает локально на устройстве; Метаданные.Имя не читается в мобильной клиентской ветви.
Поддерживается... — проверка возможностей, не разрешений ОС, занятости камеры/микрофона, качества изображения или слышимости звука. Отказ ОС и отмена пользователя требуют отдельной проверки.
Имена публичных callback связаны с настоящими ОписаниеОповещения и проверяются по GUID. Для аудио, текста, страницы, завершения серии и штрихкода сигнатуры различны; их нельзя заменять одним универсальным обработчиком.
Код явно не сохраняет медиа, не вызывает HTTP, почту, печать или бизнес-запись. Платформа/ОС могут использовать свой временный кэш; очистка переменной не доказывает удаление этого кэша. Размер32МиБ проверяется после получения байтов и не обещает предотвратить их первоначальную аллокацию.
Нормированная оценка сканирования не является OCR, распознанным текстом или гарантией юридической пригодности документа. Строгая политика>=7 каждого показателя — решение этого собственного примера.
Callback остановки звука/текста не всегда означает окончательное завершение: уведомление может временно прервать звук с последующим возобновлением. В этих уроках владелец сеанса снимается явной собственной командой остановки, не предположением о причине callback.
ПередЗакрытием имеет четыре аргумента. При ЗавершениеРаботы=Истина нельзя открывать окна или вызывать сервер: заполняется ТекстПредупреждения. Пользователь или ОС могут принудительно завершить приложение; отказ от обычного закрытия не гарантирует запрет этого. Всегда явно остановите свой микрофон/звук до выхода.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.