Как получить и установить скорость записи с помощью IMAPI2?

#c# #dvd-burning #imapi

#c# #запись dvd #imapi

Вопрос:

Кто-нибудь знает, как установить скорость записи CD / DVD (например, 4x, 10x) с помощью IMAPI2?

Кроме того, сначала мне нужно получить скорости, поддерживаемые носителем. Как я могу их получить?

Ответ №1:

  1. Для установки скорости записи вы можете использовать метод IDiscFormat2Data::SetWriteSpeed из интерфейса IDiscFormat2Data. Это позволяет запросить максимальную скорость, поддерживаемую оптическими носителями, или указать желаемую скорость записи.

  2. Чтобы получить поддерживаемые скорости записи устройством записи и текущим носителем, вы можете использовать метод IDiscFormat2Data::get_SupportedWriteSpeeds

  3. Для проверки текущей скорости записи у вас есть метод IDiscFormat2Data::get_CurrentWriteSpeed.

Эти методы используют секторы в секунду вместо 4x, 10x и т.д. Вы можете конвертировать из одного в другой, используя следующие константы:

  • IMAPI_SECTOR_SIZE Количество байтов в секторе.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_CD Базовая скорость вращения компакт-диска, измеряемая в секторах в секунду.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_DVD Базовая скорость вращения DVD-диска, измеряемая в секторах в секунду.
  • IMAPI_SECTORS_PER_SECOND_AT_1X_BD Базовая скорость вращения диска Blu-ray, измеряемая в секторах в секунду.

из заголовка imapi2.h:

 #define IMAPI_SECTORS_PER_SECOND_AT_1X_CD      75
#define IMAPI_SECTORS_PER_SECOND_AT_1X_DVD     680
#define IMAPI_SECTORS_PER_SECOND_AT_1X_BD      2195
#define IMAPI_SECTORS_PER_SECOND_AT_1X_HD_DVD  4568
  

Ответ №2:

Microsoft изначально выпустила интерфейс IMAPI для C #. У него было много проблем. Вы можете прочитать больше об этом здесь. Итак, я использую этот исходный код (написанный Эриком Хадданом в Code Project) вместо копии, выпущенной Microsoft. Итак, вы можете увидеть некоторые различия в отношении документации.

Прежде чем вы начнете взаимодействовать со скоростью записи (get / set), вам необходимо выполнить некоторые начальные действия, такие как настройка записи. Я предполагаю, что вы знаете все это и пропускаете это в этом ответе, чтобы сократить длину.

Чтобы установить скорость записи, вам необязательно сначала получить поддерживаемые скорости записи:

 private string[] GetSupportedWriteSpeeds()
{
    string[] list = new string[msftDiscFormat2Data.SupportedWriteSpeedDescriptors.Length];
    for(int i = 0; i < msftDiscFormat2Data.SupportedWriteSpeedDescriptors.Length; i  )
    {
        IWriteSpeedDescriptor objIWriteSpeedDescriptor = (IWriteSpeedDescriptor)msftDiscFormat2Data.SupportedWriteSpeedDescriptors[i];
        list[i] = objIWriteSpeedDescriptor.WriteSpeed.ToString();
    }
    return list;
}
  

Затем, на основе полученных поддерживаемых значений выше, вы можете установить скорость записи:

 private void SetWriteSpeed(int requestedSectorsPerSecond, bool rotationTypeIsPureCAV)
{
    /*selectedWritingSpeed
        Unit = Disc sectors per second.
        Values: -
        -1 = "Default OR Fastest" as documented in IMAPI documentation.
        [ANY VALUE] = Actual writing speed to set.
    */
    msftDiscFormat2Data.SetWriteSpeed(requestedSectorsPerSecond, rotationTypeIsPureCAV);
}
  

В приведенном выше методе параметром requestedSectorsPerSecond является индекс массива строк (скорость записи), полученный из предыдущего метода. Вы можете задать тип вращения (чистый CAV) на false .

Следующее от Microsoft:

RequestedSectorsPerSecond

Запрошенная скорость записи измеряется в секторах диска в секунду.

Значение 0xFFFFFFFF (-1) запрашивает, чтобы запись производилась с использованием самой высокой поддерживаемой скорости для носителя. Это значение по умолчанию.

RotationTypeIsPureCAV

Запрошенный тип управления скоростью вращения. Установите значение VARIANT_TRUE для запроса типа управления скоростью вращения с постоянной угловой скоростью (CAV). Установите значение VARIANT_FALSE, чтобы использовать другой тип управления скоростью вращения, который поддерживает рекордер. По умолчанию используется VARIANT_FALSE.

Названия объектов, используемых в приведенном выше коде, соответствуют самому IMAPI. Вот почему я не добавляю больше описания интерфейса IMAPI. Более подробная информация уже приведена в другом ответе от @rmp.