(решено) BMP to AVI
Модератор: Модераторы
(решено) BMP to AVI
Всем привет!
Порылся в google, нашёл несколько примеров, VFW и VideoWriter но они все у меня не работают, т.к. для дельфи.
Адаптация кода - тоже не помогла, там внешние библиотеки, а я сними никогда не работаю (и при ссылке на них ошибка в коде).
Есть у кого нить, работающий код Lazarus - собрать из BMP avi для windows ?
.
Порылся в google, нашёл несколько примеров, VFW и VideoWriter но они все у меня не работают, т.к. для дельфи.
Адаптация кода - тоже не помогла, там внешние библиотеки, а я сними никогда не работаю (и при ссылке на них ошибка в коде).
Есть у кого нить, работающий код Lazarus - собрать из BMP avi для windows ?
.
Последний раз редактировалось vitaly_l 24.12.2016 00:15:57, всего редактировалось 1 раз.
alexs писал(а):ImageMagic
Кстати оч. крутой пакет, спасибо (они пишут что поддерживают 200 графических форматов).
Но я не вижу ни одного ИХ примера или упоминания работы с AVI ( avi - это видео )
Вы делали там AVI или просто "на вскидку" предложили лучший пакет по графике ?
Совсем бы крохотный примерчик ?
Необязательно в Avi, можно в Mp4.
Добавлено спустя 88 минут 88 секунд:
alexs писал(а):ImageMagic?
Прочитал про пакет, вот здесь написано, что avi они (ImageMagic) только читают: http://4debian.info/wiki/f/imagemagick/
А надо чтобы код умел записывать AVI и/или mp4.
.
можно использовать ffmpeg, там есть все. Сам работаю с ним, но из под с.
можно виндовый DirectX.
и есть http://delphipage.free.fr/genereravi.html оно использует avifil32.dll. Если avifil32.dll 32битный значит и генить код нужно под 32бита.
Добавлено спустя 1 минуту 28 секунд:
насколько помню, там примеры написаны под DX7.
можно виндовый DirectX.
и есть http://delphipage.free.fr/genereravi.html оно использует avifil32.dll. Если avifil32.dll 32битный значит и генить код нужно под 32бита.
Добавлено спустя 1 минуту 28 секунд:
vitaly_l писал(а):Порылся в google, нашёл несколько примеров, VFW и VideoWriter но они все у меня не работают, т.к. для дельфи.
насколько помню, там примеры написаны под DX7.
olegy123 писал(а):есть http://delphipage.free.fr/genereravi.html оно использует avifil32.dll. Если avifil32.dll 32битный значит и генить код нужно под 32бита.
Спасибо, я видел похожие примеры, все они, после адаптации, валятся вот на этом месте:
Код: Выделить всё
function AVIFileOpen; external 'avifil32.dll' name 'AVIFileOpenA';
function AVIFileCreateStream; external 'avifil32.dll' name 'AVIFileCreateStreamA';
function AVIStreamSetFormat; external 'avifil32.dll' name 'AVIStreamSetFormat';
function AVIStreamReadFormat; external 'avifil32.dll' name 'AVIStreamReadFormat';
function AVIStreamWrite; external 'avifil32.dll' name 'AVIStreamWrite';
function AVIStreamRelease; external 'avifil32.dll' name 'AVIStreamRelease';
function AVIFileRelease; external 'avifil32.dll' name 'AVIFileRelease';
function AVIFileGetStream; external 'avifil32.dll' name 'AVIFileGetStream';
function CreateEditableStream; external 'avifil32.dll' name 'CreateEditableStream';
И я не понимаю чего Lazarus от меня хочет? Вот его сообщение об ошибке:
Код: Выделить всё
AviWriter.pas(728,23) Fatal: Syntax error, ":" expected but ";" found
Лазарус ругается на, то, что функции изначально объявлены вот так:
Код: Выделить всё
function AVIFileOpen(var ppfile: PAVIFile; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall;
function AVIFileCreateStream(pfile: PAVIFile; var ppavi: PAVISTREAM; var psi: TAVIStreamInfo): HResult; stdcall;
function AVIStreamSetFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; cbFormat: LONG): HResult; stdcall;
function AVIStreamReadFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; var cbFormat: LONG): HResult; stdcall;
function AVIStreamWrite(pavi: PAVIStream; lStart, lSamples: LONG; lpBuffer: pointer; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten: LONG; var plBytesWritten: LONG): HResult; stdcall;
function AVIStreamRelease(pavi: PAVISTREAM): ULONG; stdcall;
function AVIFileRelease(pfile: PAVIFile): ULONG; stdcall;
function AVIFileGetStream(pfile: PAVIFile; var ppavi: PAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
function CreateEditableStream(var ppsEditable: PAVISTREAM; psSource: PAVISTREAM): HResult; stdcall;
function AVISaveV(szFile: PChar; pclsidHandler: PCLSID; lpfnCallback: TAVISaveCallback;
nStreams: integer; pavi: APAVISTREAM; lpOptions: APAVICompressOptions): HResult; stdcall;
А при обращении к DLL их объявили иначе.
И Лазарусу приспичило, что нужно добавить ": HResult".
Но добавление ": HResult", вначале убирает эти, но в итоге вызывает новые ошибки.
Постольку поскольку я с DLL не работаю, я не понимаю чего Лазарус от меня хочет?
С другой стороны, я нашёл какой-то код, который при обращении к avifil32.dll - не ругается. И более того, даже создаёт AVI файл!
Но файл получается без картинок. Пустой АВИ. Поэтому я и попросил рабочий пример, ПОЖАЛУЙСТА, если у кого есть?
DirectX не пробовал, там нужно лезть DirectShow и ещё куча настроек, без примера ОЧЕНЬ сложно.
.
vitaly_l писал(а):AviWriter.pas(728,23) Fatal: Syntax error, ":" expected but ";" found
хочет в объявлении функции знать параметр результата.. т.е. ожидает ":HResult" а ему дают ";"
замените
function AVIFileOpen; external 'avifil32.dll' name 'AVIFileOpenA';
function AVIFileOpen(var ppfile: PAVIFile; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall;
на
function AVIFileOpen(var ppfile: PAVIFile; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall; external 'avifil32.dll' name 'AVIFileOpenA';
Добавлено спустя 11 минут 20 секунд:
вопрос а зачем из bmp в avi? камера?
Добавлено спустя 28 минут 20 секунд:
попоже сам проверю работу.
olegy123 писал(а):камера?
C камеры я умею сохранять в AVI ( точнее кем-то написанный кусок кода для WFV, умеет сохранять видео поток в Ави )
В том куске кода, к сожалению нет AVIFileOpen, который собственно создаёт АВИ, а мне нужно именно битмапки.
Кстати, спасибо - запустил код TAviWriter, правда внёс несколько изменений и теперь он пишет: Failed to add frame to AVI error=8000FFFF при попытке сохранить. Но при этом, AviWriter1 компилируется, создаётся и кнопочка "добавить кадр" - не ломает программу.
В общем ОПЯТЬ сбой именно при обращении к чёртовой avifil32.dll...
А к ней вообще можно обращаться? Это законно или avifil32.dll системно-лицензионная?
.
vitaly_l писал(а):Это законно или avifil32.dll системно-лицензионная?
С покупкой винды да. при условии, что в той винде она есть.
vitaly_l писал(а): Failed to add frame to AVI error=8000FFFF при попытке сохранить.
Тут может очень много причин, от неверных данных(размер/время), не того формата BMP(16/24/32бит).. до того что требуются иные либы которая использует avifil32.dll.
Надо посмотреть.
Добавлено спустя 6 минут 48 секунд:
можно использовать ffmpeg/libav - но нормальных pas хендлов нет.
olegy123 писал(а):Надо посмотреть.
Я починил. Там в исходниках TAviWriter, = BMP не делало Create и поэтому всё падало.
Теперь сохраняет АВИ и даже пишет звук! В общем Ваш пример рабочий, если его чуть допилить.
СПАСИБО!!! БОЛЬШОЕ!!!
olegy123 писал(а):С покупкой винды да. при условии, что в той винде она есть.
Ну вообще, насколько я понял avifil32.dll, есть в любой винде.
Интересно, а программисты, имеют ли право, к avifil32.dll обращаться или должны вначале купить у виндовз лицензию и\или их IDE ?
.
Все что идет в коробке винды - может в рамках этой винды использовано. если avifil32.dll идет в стандартной комплектации - то разрешено запускать в лицензионной винде.
было такое обсуждение при использование программ в wine под линукс, когда требовались дозагрузки dll-ок. использование таких dll - вне винды, незаконно.
но могут быть иные случаи - это конкретная лицензия допустим GPL и другие.
было такое обсуждение при использование программ в wine под линукс, когда требовались дозагрузки dll-ок. использование таких dll - вне винды, незаконно.
но могут быть иные случаи - это конкретная лицензия допустим GPL и другие.
Последний раз редактировалось olegy123 23.12.2016 23:20:59, всего редактировалось 1 раз.
olegy123 писал(а):Все что идет в коробе винды - может в рамках этой винды использовано.
было такое обсуждение при использование программ в wine под линукс, когда требовались дозагрузки dll-ок. использование таких dll - вне винды, незаконно.
Верю Вам на слово, т.к. так или иначе программа сделанная Лазарусом для винды - обращается к системным библиотекам винды, раз к тем DLL обращается значит и к этой DLL можно! Наверное... Впрочем пофигу, главное что ави создаются. Спасибо!
.
Добавлено спустя 55 минут 55 секунд:
PS: У кого нить есть рабочие pas хендлы для ffmpeg/libav для создания AVI ?
Или для DirectShow ?
( их тоже интересно посмотреть, хотя и не актуально )
.
А почему просто не дать команду в консоль для ffmpeg и все дела. Обязательно это делать кодом на паскале? Результат можно считать тоже из консоли в программу...
Добавлено спустя 7 минут 3 секунды:
Добавлено спустя 4 минуты 12 секунд:
ЗЫ
Проверял только под линукс. Не знаю как это будет работать на окнах
Добавлено спустя 7 минут 3 секунды:
Код: Выделить всё
.......
uses
process, ......................
.........
procedure TForm1.Button1Click(Sender: TObject);
var
AProcess: TProcess;
s: string;
i: integer;
begin
form1.Height:=70;
AProcess := TProcess.Create(nil);
//ffmpeg -f image2 -i image%d.jpg video.mpg
AProcess.Executable := 'ffmpeg';
AProcess.Parameters.Add('-f');
AProcess.Parameters.Add('image2');
AProcess.Parameters.Add('-i');
AProcess.Parameters.Add('image%d.jpg');
AProcess.Parameters.Add('video.mpg');
// Установим опции программы. Первая из них не позволит нашей программе
// выполнятся до тех пор, пока не закончит выполнение запущенная программа
// Также добавим опцию, которая говорит, что мы хотим прочитать
// вывод запущенной программы
AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
AProcess.Execute;
memo1.Lines.LoadFromStream(AProcess.Output);
s := memo1.Lines.Text;
i := Pos('что-нибудь про результат', s);
........................
AProcess.Free;
end; Добавлено спустя 4 минуты 12 секунд:
ЗЫ
Проверял только под линукс. Не знаю как это будет работать на окнах
tema писал(а):А почему просто не дать команду в консоль для ffmpeg и все дела. Обязательно это делать кодом на паскале? Результат можно считать тоже из консоли в программу...
Тогда зачем бинарник когда все можно сделать в шеле?
Когда нельзя использовать консоль и обязательно нужно делать в коде паскаля с линковкой либл: когда нужен строгий контроль по времени, когда нужно работать с большими данными где запись на диск - большая задержка и износ. Работа с многопоточными данными. Запись из разных источников, вывод в разные источники (net-stream, opengl и т.п.). Обработка OpenCV, CUDA и т.п. Фильтры..
vitaly_l писал(а):PS: У кого нить есть рабочие pas хендлы для ffmpeg/libav для создания AVI ?
когда то делал. Посмотрю.
