![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Упаковка avi [D7, WinXP]
Дмитрий Белькевич © (2008-05-29 13:40:00)Есть некая распакованная авишка. Она исправна - проигрывается без проблем. Нужно её упаковать. В качестве упаковщика использую 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 изменить? Может быть случайно кто сталкивался. Пока что единственное видимое решение - редактировать авишку 'вручную'. Но это как-то некошерно...
Дмитрий Белькевич (2008-05-30 00:03:00) [1]Продолжаем...
У меня на машине XVID начал работать и в обычном режиме и 'на лету'.
Пробую на другой машине - 'на лету' валится, в обычном - работает. Падает в модуле xvidcore.dll.
При этом xvid стоит один и тот же. Патч - и там и там - sp2, без обновлений. Дллки xvidcore.dll, xvidvfw.dll, avicap32.dll, avifil32.dll, msvfw32.dll - одинаковые...
Чудеса, как обычно...
Дмитрий Белькевич (2008-05-29 19:18:00) [2]>Посмотрите AviWriter2:
Увы - именно на её основе и делаю, переделал некоторые вещи (в т.ч. первый проход без участия винды), стало немного постабильнее, но всё равно - глюки лезут.
>AFAIK, VFW-кодек представляет собой DLL с экспортируемой функцией DriverProc
Спасибо, гляну, может удастся к кодекам прицепиться.
>Но тогда и AVI-файл придётся формировать тоже вручную.
Ну, это относительно просто, чувствую, этим и закончится.
Sapersky_ (2008-05-29 15:07:00) [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-файл придётся формировать тоже вручную.
Дмитрий Белькевич (2008-05-29 14:06:00) [4]>В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.
Исходя из этого еще вопрос. Может быть возможно кодеки как-то руками 'цеплять' без винапи, так как винда везде по-разному патченная, их много всяких, и чем дальше - тем больше. И в каждой - свои глюки.
В одной сборке, например, были глюки с созданием некомпрессированной авишки. После того, как выбросил обращение к винапи по этому поводу и заменил своим кодом - проблемы, по крайней мере, в этой части, окончились раз и навсегда. Еще бы упаковку некомпрессировнной ави без винапи сделать...
И компрессию 'на лету'... Было бы вселенское счастье ;)
p.s. всё больше понимаю пингвиноводов ;)
Дмитрий Белькевич (2008-05-29 13:55:00) [5]Отвечаю сам себе...
Не меняется, то оно не меняется. Но не меняется оно на пустое значение (''), а вот на что-то определенное ('MAKHAON') вполне меняется ;)
И начинает вопроизводится. Косяк, вполне вероятно, возникает из-за русских букв в szName (которые сама винда и вставляет).
В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.