Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-28615
Андрусь
2003-01-22 13:18
2003.02.10
Как передать в базу число > предела точности Integer


14-28996
Zhenka
2003-01-26 14:36
2003.02.10
Ув. Господа. кто нибудь знает


4-29161
BillyJeans
2002-12-27 10:47
2003.02.10
как отловить завершение сеанса или просто перезагрузку?


7-29109
Alexei113
2002-12-03 15:31
2003.02.10
Работа с Popup менню : скажите плз ...


1-28843
Natalia
2003-02-03 00:45
2003.02.10
edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский