Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

объединение WMV-файлов   Найти похожие ветки 

 
QuickFinder   (2006-04-22 11:36) [0]

Как склеить (объединить) несколько WMV-файлов?


 
Wm.DIGGER ©   (2006-05-03 13:49) [1]

если они в формате PCM нет ничего проще ...
читаешь заголовок файла, заголовок блока данных ...
потом идут сами данные ... это и есть сэмплы ...
просто добавляешь данные одного файла в конец другого и переписывашь заголовок соответственно ... если нужно могу кодом кинуть ...


 
QuickFinder   (2006-05-04 16:38) [2]


> Wm.DIGGER ©   (03.05.06 13:49) [1]


Написал на мыло, ответьте, плиз.


 
Wm.DIGGER ©   (2006-05-04 17:06) [3]

ну вот ... набросал ... должно работать ...


 hWAVEHeader = record
                    idRiff:array[0..3] of Char;
                    RiffLen:LongInt;
                    idWave:array[0..3] of Char;
                    idFmt:array[0..3] of Char;
                    InfoLen:LongInt;
                    WaveType:SmallInt;
                    Channels:SmallInt;
                    Freq:LongInt;
                    BytesPerSec:LongInt;
                    Align:SmallInt;
                    Bits:SmallInt;
                   end;

 hWAVEDATAHeader = record
                    idData:array[0..3] of Char;
                    DataLen:LongInt;
                   end;

function SetWAVEHeader(Ch,Freq,BPS:integer; RealTime:real):hWAVEHeader;
var SampleCount,DataLength:integer;
begin
 SampleCount := Round(RealTime * Freq); //STime - i?iaie?eoaeuiinou a naeoiaao
 DataLength := SampleCount * (BPS div 8) * Ch;
 Result.idRiff := "RIFF";
 Result.RiffLen := DataLength + 38;
 Result.idWave := "WAVE";
 Result.idFmt  := "fmt ";
 Result.InfoLen := 16;
 Result.WaveType := WAVE_FORMAT_PCM;
 Result.Channels := Ch;
 Result.Freq := Freq;
 Result.BytesPerSec := Freq * (BPS div 8) * Ch;
 Result.Align := (BPS div 8) * Ch;
 Result.Bits := BPS;
end;

function SetWAVEDATAHeader(WAVEHeader:hWAVEHeader):hWAVEDATAHeader;
begin
 Result.idData := "data";
 Result.DataLen := WAVEHeader.RiffLen - 38;
end;

procedure WAVEAppand(BFN,AFN:string);
var WF,AWF:TFileStream;
   WH1,WH2:hWAVEHeader;
   DH1,DH2:hWAVEDATAHeader;
   NewDataLength,BufSize:integer;
   NewTime:Real;
   Buf:array[0..1023] of SmallInt;
begin
 WF := TFileStream.Create(BFN,fmOpenReadWrite);
 WF.ReadBuffer(WH1,SizeOF(WH1));
 WF.ReadBuffer(DH1,SizeOF(DH1));
 WF.Position := WF.Position + DH1.DataLen;
 AWF := TFileStream.Create(AFN,fmOpenReadWrite);
 AWF.ReadBuffer(WH2,SizeOF(WH2));
 AWF.ReadBuffer(DH2,SizeOF(DH2));
 NewDataLength := DH1.DataLen + DH2.DataLen;
 NewTime := NewDataLength / WH1.Align / WH1.Freq;
 while AWF.Position < DH2.DataLen do
  begin
   if (AWF.Position + SizeOF(Buf)) < DH2.DataLen then BufSize := SizeOF(Buf)
     else BufSize := DH2.DataLen - AWF.Position;
   AWF.Read(Buf,BufSize);
   WF.Write(Buf,BufSize);
  end;
 WH1 := SetWAVEHeader(WH1.Channels,WH1.Freq,WH1.Bits,NewTime);
 DH1 := SetWAVEDATAHeader(WH1);
 WF.Position := 0;
 WF.WriteBuffer(WH1,SizeOF(WH1));
 WF.WriteBuffer(DH1,SizeOF(DH1));
 AWF.Free;
 WF.Free;
end;


 
QuickFinder   (2006-05-04 22:23) [4]

Спасибо за пример.

Столкнулся со следующей проблемой.
У меня для файла clip01.wmv (размером всего 1 290 810 bytes, то есть чуть больше мегабайта) DH1.DataLen вернула какую-то жуткую величину:
1 590 272 000

Как такое может быть?

Вот все заголовки файла:
idRiff: 0&Іu
RiffLen: 298804878
idWave: ¦Щ
idFmt:
InfoLen: 5340
WaveType: 0
Channels: 0
Freq: 7
BytesPerSec: -1539309055
Align: -11568
Bits: -7417

idData: Т—р
DataLen: 1590272000


 
Wm.DIGGER ©   (2006-05-05 04:31) [5]

clip01.wmv ? алгоритм только для PCM ... - WAV ...
скорее всего у этого формата просто заголовок другой и он не корректно читается ...

BytesPerSec: -1539309055
Align: -11568
Bits: -7417

это не может быть отрицательным ...

Bits - биты на семпл ... 16 бит обычно ...
Align - размер семпла  Bits div 8 * Channels
BytesPerSec - байт в секнду ... Align * Freq ...

хотя тип - WaveType: 0 - вроде нормально PCM ...
но всё равно - PCM это "кодировка" а заголовок у формата WMV явно другой ...


 
Wm.DIGGER ©   (2006-05-05 04:33) [6]

короче, тебе нужно найти как читать заголовок WMV ...
я честно говоря когда писать не обратил внимания, что это не WAV ... :)


 
QuickFinder   (2006-05-05 14:05) [7]

Так это для WAV-файлов? Сорри, не понял...

Еще мелькнула мысль: откуда у человека описание формата WMV, его вроде нигде не найти, Мелкософт прячет хорошо...


 
Анонимщики ©   (2006-05-06 11:12) [8]

Microsoft Media SDK.
Но тебе этого, на самом деле, не нужно.
Проще пойти путем построения каких-то графов.


 
Jeer ©   (2006-05-06 13:22) [9]

QuickFinder   (05.05.06 14:05) [7]


> откуда у человека описание формата WMV


говорит, да.

По делу:

WMV-Windows Medio Video.
WMA-Windows Medio Audio

Что нужно-то ?
Сложить несколько wma или сложить несколько sound-track, вытащенных из wmv ?

В любом случае, задачку лучше (меньше проблем и времени) решать внешними конверторами из сабжа в доступный формат.


 
QuickFinder   (2006-05-06 14:04) [10]


> Jeer ©   (06.05.06 13:22) [9]
> QuickFinder   (05.05.06 14:05) [7]
> Что нужно-то ?
> Сложить несколько wma или сложить несколько sound-track,
>  вытащенных из wmv ?


Имеется набор клипов WMV из одного фильма, нужно объединить эти клипы в один файл (типа того, как просто делается для MPG простым copy)


 
Jeer ©   (2006-05-06 14:06) [11]

Тогда ищи такие фичи в софте для видеомонтажа.



Страницы: 1 вся ветка

Текущий архив: 2006.12.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.087 c
15-1165226990
TohaNik
2006-12-04 13:09
2006.12.24
Зима не спешит.


15-1165145193
Pazitron_Brain
2006-12-03 14:26
2006.12.24
Когда по вашему мнению


2-1165409538
q10nik
2006-12-06 15:52
2006.12.24
Вычисления


2-1165225696
Scavenger
2006-12-04 12:48
2006.12.24
Дата и время


2-1165250006
Галинка
2006-12-04 19:33
2006.12.24
Скопировать объект в c#