-
Есть некая распакованная авишка. Она исправна - проигрывается без проблем. Нужно её упаковать. В качестве упаковщика использую 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 изменить? Может быть случайно кто сталкивался. Пока что единственное видимое решение - редактировать авишку 'вручную'. Но это как-то некошерно...
-
Отвечаю сам себе... Не меняется, то оно не меняется. Но не меняется оно на пустое значение (''), а вот на что-то определенное ('MAKHAON') вполне меняется ;)
И начинает вопроизводится. Косяк, вполне вероятно, возникает из-за русских букв в szName (которые сама винда и вставляет).
В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.
-
>В какой раз убеждаюсь, что к вин апи, по возможности, лучше не лезть. Чем больше своего кода и меньше вин апи - тем меньше проблем.
Исходя из этого еще вопрос. Может быть возможно кодеки как-то руками 'цеплять' без винапи, так как винда везде по-разному патченная, их много всяких, и чем дальше - тем больше. И в каждой - свои глюки. В одной сборке, например, были глюки с созданием некомпрессированной авишки. После того, как выбросил обращение к винапи по этому поводу и заменил своим кодом - проблемы, по крайней мере, в этой части, окончились раз и навсегда. Еще бы упаковку некомпрессировнной ави без винапи сделать... И компрессию 'на лету'... Было бы вселенское счастье ;)
p.s. всё больше понимаю пингвиноводов ;)
-
Посмотрите 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-файл придётся формировать тоже вручную.
-
>Посмотрите AviWriter2:
Увы - именно на её основе и делаю, переделал некоторые вещи (в т.ч. первый проход без участия винды), стало немного постабильнее, но всё равно - глюки лезут.
>AFAIK, VFW-кодек представляет собой DLL с экспортируемой функцией DriverProc
Спасибо, гляну, может удастся к кодекам прицепиться.
>Но тогда и AVI-файл придётся формировать тоже вручную.
Ну, это относительно просто, чувствую, этим и закончится.
-
Продолжаем...
У меня на машине XVID начал работать и в обычном режиме и 'на лету'.
Пробую на другой машине - 'на лету' валится, в обычном - работает. Падает в модуле xvidcore.dll.
При этом xvid стоит один и тот же. Патч - и там и там - sp2, без обновлений. Дллки xvidcore.dll, xvidvfw.dll, avicap32.dll, avifil32.dll, msvfw32.dll - одинаковые...
Чудеса, как обычно...
|