Почему медиаплеер показывает неправильную картинку при проигрывании MP3 из 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Встречались ли вы с ситуацией, когда при запуске из 1С аудиофайла, например, записи телефонного разговора, медиаплеер вдруг показывает совершенно постороннее изображение в качестве обложки? Часто это может быть скриншот ошибки, случайный документ или любая другая картинка, сохраненная на компьютере. Давайте разберемся, почему так происходит и как с этим бороться с помощью средств 1С.

Проблема часто возникает при использовании простых медиаплееров, таких как Media Player Classic, и аудиофайлов, созданных утилитами вроде софтфона MicroSIP, которые не встраивают в файл метаданные или обложку альбома.

Выясняем причину: почему плеер выбирает случайную картинку?

Чтобы найти правильное решение, сначала проанализируем поведение медиаплееров. Большинство из них пытаются сделать воспроизведение более наглядным и ищут обложку для трека в определенной последовательности:

  1. Встроенная обложка. Плеер в первую очередь проверяет, вшито ли изображение напрямую в метаданные аудиофайла (так называемые ID3-теги для MP3). Если да, используется именно оно.
  2. Стандартные файлы обложек. Если встроенной обложки нет, плеер ищет в той же папке, где лежит аудиофайл, файлы изображений со стандартными именами, такими как folder.jpg, cover.jpg, albumart.jpg.
  3. Первое попавшееся изображение. И вот здесь кроется корень нашей проблемы. Некоторые плееры, включая Media Player Classic, если не находят ничего из вышеперечисленного, просто берут первый попавшийся файл изображения из той же папки и используют его в качестве обложки.

Когда 1С программно сохраняет MP3-файл для проигрывания, он обычно помещается во временный каталог Windows. В этом каталоге могут находиться и другие временные файлы, включая изображения, например, скриншоты ошибок, которые вы делали ранее. В результате плеер, не найдя официальной обложки, подхватывает этот скриншот и отображает его.

Решение 1: Изоляция MP3-файла в отдельном каталоге

Самый прямой и быстрый способ, предложенный на форуме, — не давать плееру шанса найти посторонние изображения. Для этого нужно перед запуском помещать аудиофайл в "чистую" папку, где кроме него ничего не будет. Рассмотрим, как реализовать это на языке 1С.

Идея заключается в том, чтобы создать во временном каталоге отдельную подпапку, например, с именем Player, очищать ее от старых файлов перед каждым новым воспроизведением, сохранять туда наш MP3 и только после этого запускать.

Посмотрим на пример кода для клиентской процедуры в управляемой форме:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Предполагается, что функция сфз_Сервер.ПолучитьФайлДляПроигрывания(ВыбраннаяСтрока)
    // возвращает ДвоичныеДанные аудиофайла с сервера.
    ДД = сфз_Сервер.ПолучитьФайлДляПроигрывания(ВыбраннаяСтрока);
    
    // 1. Определяем путь к нашей изолированной папке.
    Каталог = КаталогВременныхФайлов() + "\Player";
    
    // 2. Проверяем, существует ли папка, и создаем ее при необходимости.
    К = Новый Файл(Каталог);
    Если НЕ К.Существует() Тогда
        СоздатьКаталог(Каталог);
    Иначе
        // 3. Если папка уже есть, очищаем ее от старых mp3-файлов,
        // чтобы не накапливать мусор.
        Попытка
            УдалитьФайлы(Каталог, "*.mp3");
        Исключение
            // Ошибку удаления можно обработать или проигнорировать.
        КонецПопытки;
    КонецЕсли;
    
    // 4. Генерируем уникальное имя для нашего файла, чтобы избежать конфликтов.
    УИ = Новый УникальныйИдентификатор();
    РезИмяФайла = Каталог + "\" + Строка(УИ) + ".mp3";
    
    // 5. Записываем двоичные данные в файл.
    ДД.Записать(РезИмяФайла);
    
    // 6. Запускаем приложение по умолчанию для mp3-файлов.
    ЗапуститьПриложение(РезИмяФайла,,Ложь);
    
    // Отключаем стандартную обработку события, чтобы 1С не выполняла лишних действий.
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Разберем этот код по шагам:

Важное замечание для многопользовательской работы. Данный код может вызвать проблемы в терминальном (RDP) режиме. Функция КаталогВременныхФайлов() вернет путь к временной папке профиля пользователя. Однако, если несколько сеансов одного и того же пользователя запустят этот код одновременно, они будут работать с одной и той же папкой \Player, что может привести к тому, что один сеанс удалит файл другого. Для повышения надежности в многопользовательской среде рекомендуется создавать еще более уникальный каталог, например, добавляя к нему идентификатор сеанса или другое уникальное значение.

Решение 2: Встраивание обложки в файл (более надежный метод)

Хотя создание отдельной папки решает проблему "здесь и сейчас", более правильным и универсальным подходом является управление метаданными самого MP3-файла.

В чем суть? Вместо того чтобы полагаться на окружение, в котором запускается файл, мы можем сами контролировать его содержимое. Это гарантирует, что файл будет отображаться корректно в любом плеере и на любом устройстве.

Есть два варианта:

  1. Полное удаление обложки. Если вы хотите, чтобы плеер гарантированно ничего не показывал, нужно программно удалить из ID3-тегов файла все данные об обложках.
  2. Встраивание стандартной обложки. Вы можете подготовить нейтральное изображение (например, логотип компании или иконку телефонной трубки) и программно встраивать его во все создаваемые MP3-файлы.

Реализация этого метода непосредственно из 1С сложнее, так как требует использования внешних компонент или вызова утилит командной строки (например, ffmpeg или специализированных редакторов тегов), которые могут изменять метаданные MP3-файлов. Однако этот способ является наиболее профессиональным и избавляет от "костылей" с временными папками, обеспечивая предсказуемое поведение файлов в любой среде.

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

← На главную