Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  18:11[Войти] | [Зарегистрироваться]
Ответ на вопрос № 47880

22-12-2006 03:11
Меня попросили оценить сроки выполнения задачи, но проблема в том что пока не могу определиться какие компоненты использовать!
Задача следующая:
Есть закриптованые файлы (скорее всего это будут mp3 mpg или avi). Нужно производить декриптование и воспроизведение этого файла для пользователя, но при этом желательно чтобы раскриптованные данный не сохранялись на жесткий диск (покрайней мере в том виде чтобы его можно было открыть при помощи стандартных плейров). То есть мне необходимо написать плейер с возможностью проигрывания этих закриптованых файлов.
В качестве реализации подумываю использовать Delphi и библиотеку activex WindowsMediaPlayer v1.0, но не знаю как осуществить воспроизведение не с жесткого диска, а к примеру из TMemoryStream. Если кто нибудь знает более подходящий компонент или как лучше реализовать эту задачу, буду признателен!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

23-12-2006 23:57 | Сообщение от автора вопроса
Читаю документацию и перевариваю всю информацию, Вы дали отличные ссылки и хорошие ответы.
Огромнейшее ВСЕМ С П А С И Б О !!!

23-12-2006 07:44
Поигрался с mmioInstallIOProc, вроде работает:

function MyIOProc(lpMMIOInfo:PMMIOINFO;uMessage:UINT;lParam1,lParam2:lParam):lResult; stdcall;
var
  Stream:TStream;
  A:Integer;
begin
  Stream:=TStream(lpMMIOInfo.adwInfo[0]);
  case uMessage of
    MMIOM_OPEN:begin
        if not Assigned(Stream) then begin
          Stream:=TFileStream.Create(Copy(PChar(lParam1),7,MaxInt),fmOpenRead or fmShareDenyNone);
          lpMMIOInfo.lDiskOffset:=Stream.Position;
          lpMMIOInfo.adwInfo[0]:=DWORD(Stream);
        end;
        Result:=MMSYSERR_NOERROR;
      end;
    MMIOM_CLOSE:begin
        Stream.Free;
        lpMMIOInfo.adwInfo[0]:=0;
        Result:=MMSYSERR_NOERROR;
      end;
    MMIOM_READ:begin
        Result:=Stream.Read(Pointer(lParam1)^,lParam2);
        //Для примера, тупое XOR "шифрование".
        for A:=0 to Result-1 do
          PByte(PChar(lParam1)+A)^:=PByte(PChar(lParam1)+A)^xor $AA;
        lpMMIOInfo.lDiskOffset:=Stream.Position;
      end;
    MMIOM_SEEK:begin
        Result:=Stream.Seek(lParam1,TSeekOrigin(lParam2));
        lpMMIOInfo.lDiskOffset:=Result;
      end
  else
    Result:=-1;
  end;
end;


//Регистрация и использование:
const
  MyID:array[0..3] of Char='MYFS';
begin
  mmioInstallIOProc(DWORD(MyID),@MyIOProc,MMIO_INSTALLPROC or MMIO_GLOBALPROC);
  MediaPlayer1.FileName:='.MYFS+'+'D:\tst.avi';
  MediaPlayer1.Open;

//AVI-шка должна быть заранее "зашифрована", примерно так:
    with TMemoryStream.Create do try
      LoadFromFile('D:\Video112.avi');
      for A:=0 to Size-1 do
        PByte(PChar(Memory)+A)^:=PByte(PChar(Memory)+A)^ xor $AA;
      SaveToFile('D:\tst.avi');
    finally
      Free;
    end;


23-12-2006 06:41
Я в этом ничего не понимаю.
вот какая-то ссылка: http://www.rsdn.ru/article/multimedia/winmmio.xml
и может будет полезна ещё одна: http://www.google.com/codesearch (там на второй странице поиска какой-то mmio.pas есть).

23-12-2006 05:39
MCI работает только с файлами
Как оказалось не только с ними, так что прошу прощения что ввёл в заблуждение.
В MSI есть такая штука как mmioInstallIOProc, там как раз через callback-и всё сделано. Вот статья в MS:
http://support.microsoft.com/kb/155360
Так что по идее, можно использовать обычный TMediaPlayer, только зарегистрировать собственный формат через mmioInstallIOProc.
Примера на Паскале найти не удалось...

22-12-2006 23:28 | Сообщение от автора вопроса
Спасибо большое теперь особых проблем со звуком не будет, но вот с видео фаилами пока беда. Разбираюсь с интерфейсами DirectShow, но пока хорошей документации не нашел. Если кто знает какой нибудь плейер с воспроизведением из мемори потока, киньте пожалуста ссылочку.

22-12-2006 11:46
Ну насчёт видео предложить ни чего не могу, так как нет опыта в данном направлении, но могу дать очень хорошую консультацию по аудио. Подобную проблему пришлось решать не так давно, потребовалось создать оригинальный CD, на котором содержались файлы, с "непонятным" расширением *.wif и программа - плеер, которая открывала данные файлы. Программа была привязана к болванке (как правильно привязать читайте книгу К.Касперски - Защита компакт дисков от копирования). Суть в чём, эти файлы невозможно открыть ни каким другим проигрывателем, кроме того, который находится на CD, причём создание копии болванки популярными копировщиками (Clone CD, Alkohol 120% и др), хоть и копировало всё один к одному, программа - плеер выдавала сообщение, что диск не оригинальный и завершала работу.
  Теперь к деталям, файлы - *.wif - это закодированные определённым алгоритмом МР3 - файлы,
алгоритм по понятным причинам привести не могу, вы можете сами написать свой алгоритм. Далее, хочу сказать большое спасибо DRON'у за хороший компонент - TMP3Player, который я скачал с его сайта http://dron.info/Files/mp3pl.rar . Данный компонент читает MP3 из TMemoryStream, причём не требует для своей работы никаких DLL. Теперь можно сказать, алгоритм работы моей "зашищенной" програмы таков:


  • Чтение файла через TFileStream в буфер.
  • Декодировние буфера.
  • Запись буфера в TMemoryStream.
  • Проигрывание TMemoryStream в TMP3Player'е


Данный поток аудио можно в этом случае "сграбить" двумя способами:


  • Через аналоговый тракт звуковой карты (потеря качества, однозначно)
  • Перехват TMemoryStream в памяти (доступен только "квалифицированным" хакерам)


Так, что надеюсь, эта консультация поможет Вам в решении Вашей проблемы.
Удачи!

22-12-2006 10:19
Василий похоже всё спутал: и MCI и звуковуху и callback-и. MCI работает только с файлами, ну а "звуковуха с буферами" не имеет отношения к воспроизведению видео. Вобщем слушайте Zloxa, думаю это наиболее правильный путь, хатя сам я такими вещами не занимался.

22-12-2006 07:32 | Сообщение от автора вопроса
Прошу прощения за нескромный вопрос, а в каком собственно хелпе делфи видели такой раздел. Может мне что, то не поглазам но в helpe delphi 7 че-то не наблюдаю.(буду смотреть дальше)

22-12-2006 06:53
Есть хэлп в дельфи Multimedia API Reference, там все есть. Сам этим занимался лет 10 назад, и исходников не сохранилось. С помощью MCI_XXXX функций Вы определяете подходящее устройство, открываете его, запускаете на воспроизведение первый буфер и определяете колбэк, который будет вызван, когда звуковуха будет заканчивать проигрыш первого буфера. В этом колбэке Вы подсунете ей очередной буфер, и так по кругу.

22-12-2006 05:18
Есть один тупой метод независящий от типа файлов (но при доступе через MMF работать не будет): надо просто подменить в импорте (подробности у Рихтера) нужной библиотеки (какая именно будет в случае с WindowsMediaPlayer я не в курсе) функцию ReadFile (и возможно ещё несколько других) на свою, которая будет выполнять дешифрование.
Где-то были даже готовые решения предназначенные для прозрачного запихивания всех требуемых файлов в один архив, то есть программа думает что читает из папки "Images", а на самом деле ей подсовывают содержимое "resources.dat". Этот метод часто в игрушках используется, чтобы не переписывать готовые библиотеки.

22-12-2006 04:59 | Сообщение от автора вопроса
В чистом API не силен. формируете стек буферов, определяете колбэк для закачки очередного буфера и запускаете на воспроизведение. Чем имено осуществляется воспроизведение, и если возможно то хотелось бы увидеть примерчик или cсылку на инфу по возможности исполнения такого метода .

22-12-2006 04:34
Если воспользоваться чистым API, то задача вполне решаема. Читаете файл, декодируете, формируете стек буферов, определяете колбэк для закачки очередного буфера и запускаете на воспроизведение. Сам таким не занимался. Единственно, этот подход железобетонно подойдет для wav, а для Ваших - м.б. маленький проблем с кодеками и т.п., но это только мои подозрения.

22-12-2006 04:10 | Сообщение от автора вопроса
Вобщем этот вариант тоже подходит (задача пока поставленна не конкретно), попытаюсь разобраться с DirectShow filter. Но тема пока не закрыта, с удовольствием почитаю другие советы и предложения!!!

22-12-2006 03:44
В свое время стояла передомной подобная задача.Вернее задача была сформулирована чуть подругому, необходимо было написать именно некую программную среду, одной  из основыных фнукций которой - воспроизведение мультимедиа, однако было жесткое условие, чтобы медиа файлы не могли быть воспроизведены какими либо иными плеерами. Однако за реализацию, я так и не взялся, сроки были очнеь сжатые а дебри там еще те для меня. На сколько я понял, медиаплеер действительно умеет воспроизводить только из файла. Посему, при разборе задачи, было принято решение реализовывать через создание DS Filter, который получает ключ дешифровки от некоего активного процесса (моего приложения). Т.О. Можно будет воспроизводить медиа, только в случае, если запущен мой процесс. Защита так себе, но, думаю 90% случаев воровства предотрватить сможет. Грабануть видео смогут только те люди, которым это действительно НАДО, а не просто ХОЧЕТСЯ.
В свое время много информации подчерпнул из http://groups.google.com/groups/search?q=directshow+filter&qt_s=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Вода мокрая или сухая?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования