Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как склеить avi и wav 
:(
    Опции темы
Гость_Гость
Дата 5.9.2005, 15:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здрасьте товарищи!
Есть у меня avi (без звука) и wav, одинаковые по длине и надо их соединить в один avi с помощью Дельфи. Помогите плзз
  Вверх
p0s0l
Дата 11.9.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Сбацал кое-что, потести... если еще нужно smile...
Пример использования:
MergeAviWav (['1.wav', '1.avi'], 'merged.avi');
(по идее можно склеивать больше чем 2 потока, но что будет - не знаю...)

Код

uses VFW;

procedure MergeAviWav (const InFiles : array of string; const OutFile : string);
var
  pStreams : array of PAVISTREAM;
  i : integer;

begin
  AVIFileInit;
  SetLength (pStreams, Length(InFiles));
  for i := 0 to High(pStreams) do
    AVIStreamOpenFromFile (pStreams[i], PChar(InFiles[i]), 0, 0, OF_READ or OF_SHARE_DENY_WRITE, nil);
  DeleteFile (OutFile);
  AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], PAVICOMPRESSOPTIONS(nil^));
  for i := 0 to High(pStreams) do AVIStreamRelease (pStreams[i]); // в случае интерфейсов этого делать не надо
  AVIFileExit;
end;


Если VFW.pas нет, то можно скачать здесь:
ftp://delphi-jedi.org/api/vfw.zip (но тогда надо заменить в коде PAVISTREAM на IAVISTREAM),
либо прописать так:
Код

const AVIFILDLL   = 'AVIFIL32.DLL';

type
  PAVISTREAM = pointer;
  PAVICOMPRESSOPTIONS = pointer;
  
procedure   AVIFileInit; stdcall; external AVIFILDLL;
procedure   AVIFileExit; stdcall; external AVIFILDLL;
function    AVIStreamOpenFromFile(var ppavi: PAVISTREAM; szFile: LPCSTR; fccType: DWORD;
                                  lParam: DWORD; mode: UINT; pclsidHandler: pointer): HResult; stdcall; external AVIFILDLL name 'AVIStreamOpenFromFileA';
function AVISaveV(szFile : LPCSTR; pclsidHandler : Pointer; lpfnCallback : Pointer;
                  nStreams : integer; var ppavi : PAVISTREAM; var plpOptions : Pointer ): HResult;
                  stdcall; external AVIFILDLL name 'AVISaveVA';
function    AVIStreamRelease(pavi: PAVISTREAM): DWORD; stdcall; external AVIFILDLL;



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 11.9.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Цитата
(по идее можно склеивать больше чем 2 потока, но что будет - не знаю...)
Сейчас ради интереса проверил - если засунуть 2 или более аудиопотока, то, как можно ожидать, в проигрывателях появляется возможность выбора трека (например для фильма: русская или английская озвучка). А если же сделать несколько видеопотоков, то первый проигрывается в окне проигрывателя, а другие - в отдельных окнах...


--------------------
С уважением, г-н Посол.
PM   Вверх
Girder
Дата 11.9.2005, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 2
Всего: 155



AVIStreamRelease забыл


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 11.9.2005, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Угу, исправил, спасиб...
Только в случае скаченного VFW.pas этого делать не надо, т.к. там интерфейсы...


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Гость
Дата 13.9.2005, 15:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пошоже я что-то недопонял smile

vfw у меня обычный, PAVISTREAM я поменял на I
но к
Код

AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], PAVICOMPRESSOPTIONS(nil^));

говорит Incompatible types: 'APAVISTREAM' and 'IAVIStream'; Incompatible types: 'APAVICompressOptions' and 'PAVICompressOptions' и Incompatible types: 'IAVIStream' and 'PAVIStream'

Спасибо smile
  Вверх
p0s0l
Дата 13.9.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Цитата
vfw у меня обычный, PAVISTREAM я поменял на I
но к
Ну видимо другая версия vfw.pas. Либо скачай по линку, который я давал, либо пропиши объявления функций...
А по смыслу получается, что тебе нужно использовать PAVISTREAM, а не IAVISTREAM...


--------------------
С уважением, г-н Посол.
PM   Вверх
Guest
Дата 14.9.2005, 19:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











smile
access violation at avifil32.dll
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, vfw, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
  procedure MergeAviWav (const InFiles : array of string; const OutFile : string);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MergeAviWav (const InFiles : array of string; const OutFile : string);
var
  pStreams : array of IAVISTREAM;
  i : integer;
begin
  AVIFileInit;
  SetLength (pStreams, Length(InFiles));
  for i := 0 to High(pStreams) do
    AVIStreamOpenFromFile (pStreams[i], PChar(InFiles[i]), 0, 0, OF_READ or OF_SHARE_DENY_WRITE, nil);
  DeleteFile (OutFile);
  AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], PAVICOMPRESSOPTIONS(nil^));
//  for i := 0 to High(pStreams) do AVIStreamRelease (pStreams[i]); // â ñëó÷àå èíòåðôåéñîâ ýòîãî äåëàòü íå íàäî
  AVIFileExit;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MergeAviWav (['c:\1.wav', 'c:\1.avi'], 'c:\1result.avi');
end;

end.
 

vfw с jedi
help plz smile
  Вверх
p0s0l
Дата 14.9.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Хм...
Код был без всяких проверок для удобочитаемости... Поэтому вот код с проверками на ошибки. Напиши тут, то что выведет...
Кроме того, убедись что в системе есть все нужные кодеки. Т.е. проверь, проигрывает ли MediaPlayer эти файлы по-отдельности (c:\1.wav и c:\1.avi) ?
Я уж всяко сейчас попробовал, разные AVI-шки склеивать, и большие и маленькие, разные WAV-ы (как PCM-ные, так и с компрессией, MPEG3, OGG), ошибок не вылезало... хм...
Код

function AviErr (Code : DWORD) : string;
begin
  case Code of
    AVIERR_UNSUPPORTED    : Result := 'AVIERR_UNSUPPORTED';
    AVIERR_BADFORMAT      : Result := 'AVIERR_BADFORMAT';
    AVIERR_MEMORY         : Result := 'AVIERR_MEMORY';
    AVIERR_INTERNAL       : Result := 'AVIERR_INTERNAL';
    AVIERR_BADFLAGS       : Result := 'AVIERR_BADFLAGS';
    AVIERR_BADPARAM       : Result := 'AVIERR_BADPARAM';
    AVIERR_BADSIZE        : Result := 'AVIERR_BADSIZE';
    AVIERR_BADHANDLE      : Result := 'AVIERR_BADHANDLE';
    AVIERR_FILEREAD       : Result := 'AVIERR_FILEREAD';
    AVIERR_FILEWRITE      : Result := 'AVIERR_FILEWRITE';
    AVIERR_FILEOPEN       : Result := 'AVIERR_FILEOPEN';
    AVIERR_COMPRESSOR     : Result := 'AVIERR_COMPRESSOR';
    AVIERR_NOCOMPRESSOR   : Result := 'AVIERR_NOCOMPRESSOR';
    AVIERR_READONLY       : Result := 'AVIERR_READONLY';
    AVIERR_NODATA         : Result := 'AVIERR_NODATA';
    AVIERR_BUFFERTOOSMALL : Result := 'AVIERR_BUFFERTOOSMALL';
    AVIERR_CANTCOMPRESS   : Result := 'AVIERR_CANTCOMPRESS';
    AVIERR_USERABORT      : Result := 'AVIERR_USERABORT';
    AVIERR_ERROR          : Result := 'AVIERR_ERROR';
    AVIERR_OK             : Result := 'AVIERR_OK';
  else
    Result := '0x' + IntToHex(Code, 8);
  end;
end;

procedure TForm1.MergeAviWav (const InFiles : array of string; const OutFile : string);
var
  pStreams : array of IAVISTREAM;
  pOptions : array of PAVICOMPRESSOPTIONS;
  i : integer;
  Res : HRESULT;
  fcc : DWORD;
  ext : string;

begin
  AVIFileInit;
  try
    SetLength (pStreams, Length(InFiles));
    SetLength (pOptions, Length(InFiles));
    for i := 0 to High(pStreams) do
    begin
      ext := AnsiUpperCase(ExtractFileExt (InFiles[i]));
      if ext = '.AVI' then fcc := streamtypeVIDEO
        else if ext = '.WAV' then fcc := streamtypeAUDIO
          else fcc := 0;
      Res := AVIStreamOpenFromFile (pStreams[i], PChar(InFiles[i]), fcc, 0, OF_READ or OF_SHARE_DENY_WRITE, nil);
      if Res <> 0 then raise Exception.Create( AviErr(Res) + ', AVIStreamOpenFromFile: ' + InFiles[i] );
      pOptions[i] := nil;
    end;
    DeleteFile (OutFile);
    Res := AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], pOptions[0]);
    if Res <> 0 then raise Exception.Create( AviErr(Res) + ', AVISaveV' );
  finally
    AVIFileExit;
  end;
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Гость
Дата 15.9.2005, 19:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Урра, работает! smile
p0s0l, cпасибо огромное!

  Вверх
p0s0l
Дата 15.9.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



А ты выяснил в чем была причина ?
(Это нужно знать на будущее...)
Я вроде ничего критичного в коде не изменял...
Может это было из-за опций ?
Попробуй вместо этой строки:
Код
 Res := AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], pOptions[0]);
такую:
Код
 Res := AVISaveV (PChar(OutFile), nil, nil, Length(InFiles), pStreams[0], PAVICOMPRESSOPTIONS(nil^));

Если это было не из-за опций, то еще одно изменение, которое я сделал - это указывание типа извлекаемого потока... Попробуй вместо:
Код
      if ext = '.AVI' then fcc := streamtypeVIDEO    
        else if ext = '.WAV' then fcc := streamtypeAUDIO    
          else fcc := 0;
написать
Код
fcc := 0;
(т.е. все эти IF'ы убрать, вместо них fcc := 0)


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_Гость
Дата 16.9.2005, 15:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
А ты выяснил в чем была причина ?

avi, который я пытался соединить не читался
Цитата
Я вроде ничего критичного в коде не изменял...

просто avierr помогла пределить причину
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.