Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2013, 22:05   #1
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию RAW audio finder (16 kB detected)

Всем привет! Появился такой вопрос по поиску raw-потоков в файле неизвестного типа. Мне нужен поиск raw audio (pcm-формат). Вот как это реализовать - хз.. На одном из форумов подсказали, что нужно составлять список из наиболее популярных pcm-форматов и прогнать их через Фурье-фильтр, проанализировать результат. Ну как то так я себе это представляю:

1. Разбиваем файл на блоки (по 16 кБ каждый)
! 2. Как то анализируем первый блок. Если он совпадает с каким нибудь pcm-форматом, записываем его куда нибудь, анализируем второй блок. Второй блок совпал? Отлично, идем дальше. Если третий и последующие блоки не совпадают, то, получается, наш raw-файл - это первые два блока. Соединяем их, записываем в файл.

Но вот как реализовать второй пункт - хз. нигде не нашел подобного вопроса или какой либо информации.

Смог реализовать только первый пункт

Код:
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  Windows, SysUtils, Classes;

const
  BufSize = 16384;

var
  Buffer: TByteArray;
  FileSize: Int64;
  hFile, Readed: Longword;

function GetFileSize64(S: AnsiString): Int64;
var
  FD: TWin32FindData;
  FH: THandle;
begin
  FH := FindFirstFile(PChar(S), FD);
  if FH = INVALID_HANDLE_VALUE then
    Result := 0
  else
    try
      Result := FD.nFileSizeHigh;
      Result := Result shl 32;
      Result := Result + FD.nFileSizeLow;
    finally
      Windows.FindClose(FH);
    end;
end;

function FindRAWS(FileName: AnsiString): TList;
var tmpRes: Integer;
begin
  Readed:= 0;
  FileSize:= GetFileSize64(FileName);

  Write('Open input file...');

  hFile:= CreateFile(PAnsiChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if hFile = INVALID_HANDLE_VALUE then begin
    Writeln(#9 + '[ERROR (INVALID_HANDLE_VALUE)]');
    Exit;
  end;

  Writeln(#9 + '[DONE]');

  repeat
    Write('Read ', BufSize, ' bytes from file...');
    ReadFile(hFile, Buffer, BufSize, Readed, nil);

    //тут нужно как то проверять, совпадает ли блок с raw

    if Length(Buffer) > 0 then
      Writeln(#9 + '[DONE]') else
        Writeln(#9 + '[ERROR (Buffer length = 0)]');
  until SetFilePointer(hFile, 0, 0, FILE_CURRENT) >= (FileSize);

  Writeln('');

  Writeln('Total readed bytes: ', SetFilePointer(hFile, 0, 0, FILE_CURRENT));
end;  

begin
  Writeln('');
  FindRAWS('1.unkarc');
  ReadLn;
end.
RibGeDx вне форума Ответить с цитированием
Старый 03.02.2013, 11:53   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Второй пункт НАМНОГО сложнее первого. Поэтому тот факт, что у Вас получился первый пункт и не получился второй, удивления не вызывает.
2. Тот алгоритм, который Вам предложили "на форуме", Вы не поняли (собственно, из-за этого и не можете реализовать). Потому как если бы поняли, то одновременно понимали бы, что сформулированный Вами первый пункт не ведет к решению задачи.

Теперь по поводу самого алгоритма, который Вам предложили "на форуме".
1. Алгоритм статистический (то, что у Вас называется "проанализировать" - это как раз статистика), т.е. верный результат Вы можете получить лишь с какой-то вероятностью.
2. Границы звуковых фрагментов Вам нужно будет получить не с точностью до 16 кБ, а с точностью до одного байта.
3. Сопоставляя 1 и 2, получаем, что если "серединки" фрагментов статистически и могут быть получены с достаточно высокой вероятностью, для нахождения границ статистические методы вряд ли смогут дать достаточную точность.

И последнее:
- Прежде, чем писать первую строчку кода, нужно продумать от начала до конца всю задачу. Это называется проектированием. И проектирование я бы начал именно с задачи "проанализировать".
Напишите по-русски, как Вы собираетесь проводить этот анализ, что для этого использовать.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GetDIBits пишет за буфеер => Heap corruption detected. TwiX Win Api 2 16.11.2013 22:27
Ambiguous name detected: CommandButton2_Click ramzes777 Microsoft Office Excel 3 23.12.2011 19:46
detected IDE drivers nikox12 Компьютерное железо 1 02.05.2011 19:51
Raw сокеты liljon Win Api 1 21.05.2010 23:45
Ошибка:*** glibc detected *** free(): invalid next size (fast): 0x0807dc70 *** ciaonataha Общие вопросы C/C++ 3 05.05.2009 16:58