Конференция "Media" » Упаковка avi [D7, WinXP]
 
  • Дмитрий Белькевич © (29.05.08 13:40) [0]
    Есть некая распакованная авишка. Она исправна - проигрывается без проблем. Нужно её упаковать. В качестве упаковщика использую XVID.
    Пакую следующим кодом (привожу частично):


      AVIERR := AVIFileOpen(pfile, PChar(TempFileName), OF_READ, nil);
      if AVIERR <> AVIERR_OK then
       raise Exception.Create('Unable to write output file. Error ' + IntToHex(AVIERR, 8));

      AVIERR := AVIFileGetStream(pfile, fCompStream, streamtypeVIDEO, 0);
      if AVIERR <> AVIERR_OK then
       raise Exception.Create('Unable to write output file. Error ' + IntToHex(AVIERR, 8));

      Streams[0] := fCompStream;
      Streams[1] := AudioStream;
      if fFourCC = '' then
       CompOptions[0] := nil
      else
       CompOptions[0] := @AviCompressoptions;
      CompOptions[1] := nil;

      AVIERR := AVISaveV(PChar(filename), nil, @AviSaveCallback, nStreams, Streams, CompOptions);



    Получающийся файл не воспроизводится. Пробовал Медиаплеером, Лайт аллоем.

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

    Посмотрел TAviStreamInfo у обоих файлов. Отличаются szName.
    В невоспроизводящемся файле туда вставляется строчка "~AWTemp.avi Видео #1". В воспроизодящемся - поле пустое.
    Эти же данные записываются в заголовок авишки. Файлы отличаются только наличием/отсутствием этого поля.

    Попробовал редактировать с помощью EditStreamSetInfo и EditStreamSetName, предварительно переведя поток в редактируемое состояние CreateEditableStream. Увы - ничего не меняется. Ошибок ни одна функция не возвращает - всё проверяею.

    Так вот главный вопрос: как этот szName изменить? Может быть случайно кто сталкивался. Пока что единственное видимое решение - редактировать авишку 'вручную'. Но это как-то некошерно...
  • Дмитрий Белькевич © (29.05.08 13:55) [1]
    Отвечаю сам себе...
    Не меняется, то оно не меняется. Но не меняется оно на пустое значение (''), а вот на что-то определенное ('MAKHAON') вполне меняется ;)

    И начинает вопроизводится. Косяк, вполне вероятно, возникает из-за русских букв в szName (которые сама винда и вставляет).

    В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.
  • Дмитрий Белькевич © (29.05.08 14:06) [2]
    >В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.

    Исходя из этого еще вопрос. Может быть возможно кодеки как-то руками 'цеплять' без винапи, так как винда везде по-разному патченная, их много всяких, и чем дальше - тем больше. И в каждой - свои глюки.
    В одной сборке, например, были глюки с созданием некомпрессированной авишки. После того, как выбросил обращение к винапи по этому поводу и заменил своим кодом - проблемы, по крайней мере, в этой части, окончились раз и навсегда. Еще бы упаковку некомпрессировнной ави без винапи сделать...
    И компрессию 'на лету'... Было бы вселенское счастье ;)

    p.s. всё больше понимаю пингвиноводов ;)
  • Sapersky_ (29.05.08 15:07) [3]
    Посмотрите AviWriter2:
    http://www.programania.com/aviwriter_2.zip
    Компрессия "на лету" там тоже есть, хотя не все кодеки её поддерживают.
    Если надо, есть "облегченный" вариант для TFastDIB.

    Может быть возможно кодеки как-то руками 'цеплять' без винапи

    AFAIK, VFW-кодек представляет собой DLL с экспортируемой функцией DriverProc, которая вызывается с разными параметрами для совершения различных действий (см, например, исходники кодека: http://www.free-codecs.com/download/Motion_Codecs_Predictor_codec_Mhuffyuv_codec.htm или подобных). Т.е. вроде бы ничто не мешает загрузить эту DLL вручную и вызвать DriverProc с нужными параметрами. Но тогда и AVI-файл придётся формировать тоже вручную.
  • Дмитрий Белькевич © (29.05.08 19:18) [4]
    >Посмотрите AviWriter2:

    Увы - именно на её основе и делаю, переделал некоторые вещи (в т.ч. первый проход без участия винды), стало немного постабильнее, но всё равно - глюки лезут.

    >AFAIK, VFW-кодек представляет собой DLL с экспортируемой функцией DriverProc

    Спасибо, гляну, может удастся к кодекам прицепиться.

    >Но тогда и AVI-файл придётся формировать тоже вручную.

    Ну, это относительно просто, чувствую, этим и закончится.
  • Дмитрий Белькевич © (30.05.08 00:03) [5]
    Продолжаем...

    У меня на машине XVID начал работать и в обычном режиме и 'на лету'.

    Пробую на другой машине - 'на лету' валится, в обычном - работает. Падает в модуле xvidcore.dll.

    При этом xvid стоит один и тот же. Патч - и там и там - sp2, без обновлений. Дллки xvidcore.dll, xvidvfw.dll, avicap32.dll, avifil32.dll, msvfw32.dll - одинаковые...

    Чудеса, как обычно...
 
Конференция "Media" » Упаковка avi [D7, WinXP]
Есть новые Нет новых   [133929   +472][b:0][p:0.001]