(решено) BMP to AVI

Модератор: Модераторы

(решено) BMP to AVI

Сообщение vitaly_l » 23.12.2016 16:48:24

Всем привет!

Порылся в google, нашёл несколько примеров, VFW и VideoWriter но они все у меня не работают, т.к. для дельфи.
Адаптация кода - тоже не помогла, там внешние библиотеки, а я сними никогда не работаю (и при ссылке на них ошибка в коде).

Есть у кого нить, работающий код Lazarus - собрать из BMP avi для windows ?


.
Последний раз редактировалось vitaly_l 24.12.2016 01:15:57, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: BMP to AVI

Сообщение alexs » 23.12.2016 17:11:30

ImageMagic?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: BMP to AVI

Сообщение vitaly_l » 23.12.2016 18:16:18

alexs писал(а):ImageMagic

Кстати оч. крутой пакет, спасибо (они пишут что поддерживают 200 графических форматов).
Но я не вижу ни одного ИХ примера или упоминания работы с AVI ( avi - это видео )

Вы делали там AVI или просто "на вскидку" предложили лучший пакет по графике ?
Совсем бы крохотный примерчик ?

Необязательно в Avi, можно в Mp4.

Добавлено спустя 88 минут 88 секунд:
alexs писал(а):ImageMagic?

Прочитал про пакет, вот здесь написано, что avi они (ImageMagic) только читают: http://4debian.info/wiki/f/imagemagick/
А надо чтобы код умел записывать AVI и/или mp4.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: BMP to AVI

Сообщение olegy123 » 23.12.2016 21:35:50

можно использовать ffmpeg, там есть все. Сам работаю с ним, но из под с.

можно виндовый DirectX.

и есть http://delphipage.free.fr/genereravi.html оно использует avifil32.dll. Если avifil32.dll 32битный значит и генить код нужно под 32бита.

Добавлено спустя 1 минуту 28 секунд:
vitaly_l писал(а):Порылся в google, нашёл несколько примеров, VFW и VideoWriter но они все у меня не работают, т.к. для дельфи.

насколько помню, там примеры написаны под DX7.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: BMP to AVI

Сообщение vitaly_l » 23.12.2016 22:18:01

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
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: BMP to AVI

Сообщение olegy123 » 23.12.2016 22:32:14

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
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: BMP to AVI

Сообщение vitaly_l » 23.12.2016 23:19:30

olegy123 писал(а):камера?

C камеры я умею сохранять в AVI ( точнее кем-то написанный кусок кода для WFV, умеет сохранять видео поток в Ави )
В том куске кода, к сожалению нет AVIFileOpen, который собственно создаёт АВИ, а мне нужно именно битмапки.

Кстати, спасибо - запустил код TAviWriter, правда внёс несколько изменений и теперь он пишет: Failed to add frame to AVI error=8000FFFF при попытке сохранить. Но при этом, AviWriter1 компилируется, создаётся и кнопочка "добавить кадр" - не ломает программу.
В общем ОПЯТЬ сбой именно при обращении к чёртовой avifil32.dll...

А к ней вообще можно обращаться? Это законно или avifil32.dll системно-лицензионная?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: BMP to AVI

Сообщение olegy123 » 23.12.2016 23:42:22

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
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

(решено) Re: BMP to AVI

Сообщение vitaly_l » 23.12.2016 23:52:06

olegy123 писал(а):Надо посмотреть.

Я починил. Там в исходниках TAviWriter, = BMP не делало Create и поэтому всё падало.
Теперь сохраняет АВИ и даже пишет звук! В общем Ваш пример рабочий, если его чуть допилить.

СПАСИБО!!! БОЛЬШОЕ!!!

olegy123 писал(а):С покупкой винды да. при условии, что в той винде она есть.

Ну вообще, насколько я понял avifil32.dll, есть в любой винде.

Интересно, а программисты, имеют ли право, к avifil32.dll обращаться или должны вначале купить у виндовз лицензию и\или их IDE ?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: BMP to AVI

Сообщение olegy123 » 24.12.2016 00:10:20

Все что идет в коробке винды - может в рамках этой винды использовано. если avifil32.dll идет в стандартной комплектации - то разрешено запускать в лицензионной винде.
было такое обсуждение при использование программ в wine под линукс, когда требовались дозагрузки dll-ок. использование таких dll - вне винды, незаконно.
но могут быть иные случаи - это конкретная лицензия допустим GPL и другие.
Последний раз редактировалось olegy123 24.12.2016 00:20:59, всего редактировалось 1 раз.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: BMP to AVI

Сообщение vitaly_l » 24.12.2016 00:19:36

olegy123 писал(а):Все что идет в коробе винды - может в рамках этой винды использовано.
было такое обсуждение при использование программ в wine под линукс, когда требовались дозагрузки dll-ок. использование таких dll - вне винды, незаконно.

Верю Вам на слово, т.к. так или иначе программа сделанная Лазарусом для винды - обращается к системным библиотекам винды, раз к тем DLL обращается значит и к этой DLL можно! Наверное... Впрочем пофигу, главное что ави создаются. Спасибо!

.

Добавлено спустя 55 минут 55 секунд:
PS: У кого нить есть рабочие pas хендлы для ffmpeg/libav для создания AVI ?
Или для DirectShow ?
( их тоже интересно посмотреть, хотя и не актуально )

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: (решено) BMP to AVI

Сообщение tema » 24.12.2016 02:15:14

А почему просто не дать команду в консоль для ffmpeg и все дела. Обязательно это делать кодом на паскале? Результат можно считать тоже из консоли в программу...

Добавлено спустя 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
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: (решено) BMP to AVI

Сообщение olegy123 » 24.12.2016 04:46:00

tema писал(а):А почему просто не дать команду в консоль для ffmpeg и все дела. Обязательно это делать кодом на паскале? Результат можно считать тоже из консоли в программу...

Тогда зачем бинарник когда все можно сделать в шеле?

Когда нельзя использовать консоль и обязательно нужно делать в коде паскаля с линковкой либл: когда нужен строгий контроль по времени, когда нужно работать с большими данными где запись на диск - большая задержка и износ. Работа с многопоточными данными. Запись из разных источников, вывод в разные источники (net-stream, opengl и т.п.). Обработка OpenCV, CUDA и т.п. Фильтры..

vitaly_l писал(а):PS: У кого нить есть рабочие pas хендлы для ffmpeg/libav для создания AVI ?

когда то делал. Посмотрю.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Графика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru