Форум: "Media";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
ВнизDirectShow Найти похожие ветки
← →
Ricks (2002-10-16 17:41) [0]Здравствуйте!
У меня вопрос к знатокам DirectShow. Я делаю player, ну и хочется чтоб с наворотами... Так вот, как мне получить BitRate и частоту AUDIO. Нашёл интерфейсы типа IAudioData, вроде то, что мне подходит, а вот получить его не получается (пробовал напрямую - GraphBuilder.QueryInterface). Помогите пожайлуста.
← →
Владимир Васильев (2002-10-16 18:45) [1]Использование IAudioMediaStream, IAudioStreamSample, IMemoryData, IAudioData см. в "Audio Streaming Sample Code" в SDK.
← →
Ricks (2002-10-16 18:48) [2]Да, я забыл сказать, что у меня этого самого SDK то и нету... Если бы было, я бы...!!!
← →
Владимир Васильев (2002-10-16 18:59) [3]можно забрать отсюда http://www.progdigy.com/
← →
SCHMaster (2002-10-27 02:41) [4]Если лень рыться в DirectShow (а это дело нудное, сам знаю),
то лови код, правда не мой. Зато работает.
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение информации о AVI файле
Зависимости: Graphics
Автор: [NIKEL], nikel@pisem.net, Norilsk
Copyright: Some help
Дата: 15 сентября 2002 г.
***************************************************** }
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ReadAviInfo(FileName: string);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ReadAviInfo(FileName: string);
var
iFileHandle: Integer; // хэндл файла
// Для позмционирования в AVI файле
Aviheadersize: integer;
Vheadersize: integer;
Aviheaderstart: integer;
Vheaderstart: integer;
Aheaderstart: integer;
Astrhsize: integer;
// Временные переменные
TempTest: String[5];
TempSize: Integer;
TempVcodec: String[5];
TempAcodec: integer;
TempMicrosec: integer;
TempLengthInFrames: integer;
TempAchannels: integer;
TempAsamplerate: integer;
TempAbitrate: integer;
//Выходные данные
Size: double;
Length: string;
Vcodec: string;
Vbitrate: double;
VWidth: integer;
VHeight: integer;
Fps: double;
LengthInSec: double;
Acodec: string;
Abitrate: string;
begin
// Открываем
iFileHandle := FileOpen(FileName, fmOpenRead);
// Грубая проверка на подлинность файла
FileSeek(iFileHandle, 7, 0);
FileRead(iFileHandle, TempTest, 5);
if copy(TempTest, 0, 4) <> "AVI " then
begin
MessageDlg("Could not open " + FileName + " because it is not a valid video file", mtError, [mbOk], 0);
Exit;
end;
// Размер файла
FileSeek(iFileHandle,4,0);
FileRead(iFileHandle, TempSize, 4);
// Размер хедера (needed to locate the audio part)
FileSeek(iFileHandle,28,0);
FileRead(iFileHandle, Aviheadersize, 4);
// старт хедера (needed to locate the video part)
Aviheaderstart := 32;
// Милисекунды (1000000 / TempMicrosec = fps)
FileSeek(iFileHandle,Aviheaderstart,0);
FileRead(iFileHandle, TempMicrosec, 4);
// Размер во фреймах
FileSeek(iFileHandle,Aviheaderstart + 16,0);
FileRead(iFileHandle, TempLengthInFrames, 4);
// Ширина
FileSeek(iFileHandle,Aviheaderstart + 32,0);
FileRead(iFileHandle, VWidth, 4);
// Высота
FileSeek(iFileHandle,Aviheaderstart + 36,0);
FileRead(iFileHandle, VHeight, 4);
FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0);
FileRead(iFileHandle, Vheadersize, 4);
Vheaderstart := Aviheaderstart + Aviheadersize + 20;
// кодек
FileSeek(iFileHandle,Vheaderstart + 3,0);
FileRead(iFileHandle, TempVCodec, 5);
Aheaderstart := Vheaderstart + Vheadersize + 8;
FileSeek(iFileHandle,Aheaderstart - 4,0);
FileRead(iFileHandle, Astrhsize, 5);
// Audio codec
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 8,0);
FileRead(iFileHandle, TempACodec, 2);
// Audio каналы (1 = mono, 2 = stereo)
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 10,0);
FileRead(iFileHandle, TempAchannels, 2);
// Audio samplerate
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 12,0);
FileRead(iFileHandle, TempAsamplerate, 4);
// Audio bitrate
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 16,0);
FileRead(iFileHandle, TempAbitrate, 4);
// закрываем файл
FileClose(iFileHandle);
← →
SCHMaster (2002-10-27 02:43) [5]Далее ...
// анализируем видео кодек (можно добавить больше)
Vcodec := copy(TempVcodec, 0, 4);
if Vcodec = "div2" then Vcodec := "MS MPEG4 v2"
else if Vcodec = "DIV2" then Vcodec := "MS MPEG4 v2"
else if Vcodec = "div3" then Vcodec := "DivX;-) MPEG4 v3"
else if Vcodec = "DIV3" then Vcodec := "DivX;-) MPEG4 v3"
else if Vcodec = "div4" then Vcodec := "DivX;-) MPEG4 v4"
else if Vcodec = "DIV4" then Vcodec := "DivX;-) MPEG4 v4"
else if Vcodec = "div5" then Vcodec := "DivX;-) MPEG4 v5"
else if Vcodec = "DIV5" then Vcodec := "DivX;-) MPEG4 v5"
else if Vcodec = "divx" then Vcodec := "DivX 4"
else if Vcodec = "mp43" then Vcodec := "Microcrap MPEG4 v3";
// тоже с аудио
case TempAcodec of
0: Acodec := "PCM";
1: Acodec := "PCM";
85: Acodec := "MPEG Layer 3";
353: Acodec := "DivX;-) Audio";
8192: Acodec := "AC3-Digital";
else
Acodec := "Unknown (" + IntToStr(TempAcodec) + ")";
end;
case (Trunc(TempAbitrate / 1024 * 8)) of
246..260: Abitrate := "128 Kbit/s";
216..228: Abitrate := "128 Kbit/s";
187..196: Abitrate := "128 Kbit/s";
156..164: Abitrate := "128 Kbit/s";
124..132: Abitrate := "128 Kbit/s";
108..116: Abitrate := "128 Kbit/s";
92..100: Abitrate := "128 Kbit/s";
60..68: Abitrate := "128 Kbit/s";
else
Abitrate := FormatFloat("# Kbit/s", TempAbitrate / 1024 * 8);
end;
// тут некоторые вычисления
Size := TempSize / 1024 / 1024;
Fps := 1000000 / TempMicrosec; // FPS
LengthInSec := TempLengthInFrames / fps; // Length in seconds
Length := FormatFloat("# min", Int(LengthInSec / 60)) + FormatFloat(" # sec",
Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;
// Выводим инфу в мемо
Memo1.Lines.Add("AVI INFORMATION");
Memo1.lines.Add("Size: " + FormatFloat("#.## MB",Size));
Memo1.Lines.Add("Length: " + Length);
Memo1.Lines.Add("");
Memo1.Lines.Add("VIDEO INFORMATION");
Memo1.Lines.Add("Codec: " + Vcodec);
Memo1.Lines.Add("Bitrate: " + FormatFloat("# Kbit/s", Vbitrate));
Memo1.lines.Add("Width: " + IntToStr(VWidth) + " px");
Memo1.lines.Add("Height: " + IntToStr(VHeight) + " px");
Memo1.Lines.Add("FPS: " + FormatFloat("#.##", fps));
Memo1.Lines.Add("");
Memo1.Lines.Add("AUDIO INFORMATION");
Memo1.Lines.Add("Codec: " + Acodec);
Memo1.Lines.Add("Bitrate: " + Abitrate);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then ReadAviInfo(OpenDialog1.FileName);
end;
end.
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Интегрирование в EXE-шник других файлов
Процедура из указанного файла (FileName) создаёт unit в котором объявлен, заполненный побайтово, массив и процедура сохранения этого массива обратно в файл. Таким образом можно включить в один EXE-шник множество других файлов (dll, ocx, dbf и т.п.) - прикрепить их как unit-ы. Фактически, после сжатия EXE-шника программами типа UPX, получаем довольно компактный файл, который можно использовать в качестве дистрибутива, например.
Зависимости: SysUtils, System
Автор: Delirium
Copyright: Delirium (Master BRAIN)
Дата: 22 мая 2002 г.
***************************************************** }
procedure FileToPas(FileName:String);
var BF:File of Byte;
F:TextFile;
P,N,S:String;
BFSize:integer;
BBB:Byte;
begin
AssignFile(BF,FileName);
Reset(BF);
BFSize:=FileSize(BF);
P:=ExtractFilePath(FileName);
N:=ExtractFileName(FileName);
N:=ChangeFileExt(N,".PAS");
AssignFile(F,N);
ReWrite(F);
Writeln(F,"(* Generated by Master BRAIN (C) 2002 *)");
Writeln(F,"unit "+ChangeFileExt(N,"")+";");
Writeln(F);
Writeln(F,"interface");
Writeln(F);
Writeln(F,"const FileSize:integer="+IntToStr(BFSize)+";");
Writeln(F,"FileData:array[0.."+IntToStr(BFSize-1)+"] of Byte=");
Writeln(F,"(");
while not Eof(BF) do
begin
S:="";
while (not Eof(BF)) and (Length(S)<80) do
begin
Read(BF,BBB);
S:=S+IntToStr(BBB)+",";
end;
if Eof(BF) then Delete(S,Length(S),1);
Writeln(F,S);
end;
CloseFile(BF);
Writeln(F,");");
Writeln(F);
Writeln(F,"procedure SaveToFile(FileName:String);");
Writeln(F);
Writeln(F,"implementation");
Writeln(F);
Writeln(F,"procedure SaveToFile(FileName:String);");
Writeln(F,"var F:File of Byte;");
Writeln(F," i:integer;");
Writeln(F,"begin");
Writeln(F,"AssignFile(F,FileName);");
Writeln(F,"ReWrite(F);");
Writeln(F,"for i:=0 to FileSize-1 do Write(F,FileData[i]);");
Writeln(F,"CloseFile(F);");
Writeln(F,"end;");
Writeln(F);
Writeln(F,"end.");
CloseFile(F);
end;
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c