Меня попросили оценить сроки выполнения задачи, но проблема в том что пока не могу определиться какие компоненты использовать!
Задача следующая:
Есть закриптованые файлы (скорее всего это будут mp3 mpg или avi). Нужно производить декриптование и воспроизведение этого файла для пользователя, но при этом желательно чтобы раскриптованные данный не сохранялись на жесткий диск (покрайней мере в том виде чтобы его можно было открыть при помощи стандартных плейров). То есть мне необходимо написать плейер с возможностью проигрывания этих закриптованых файлов.
В качестве реализации подумываю использовать Delphi и библиотеку activex WindowsMediaPlayer v1.0, но не знаю как осуществить воспроизведение не с жесткого диска, а к примеру из TMemoryStream. Если кто нибудь знает более подходящий компонент или как лучше реализовать эту задачу, буду признателен!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
23-12-2006 23:57 | Сообщение от автора вопроса
Читаю документацию и перевариваю всю информацию, Вы дали отличные ссылки и хорошие ответы.
Огромнейшее ВСЕМ С П А С И Б О !!!
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;
MCI работает только с файлами
Как оказалось не только с ними, так что прошу прощения что ввёл в заблуждение.
В MSI есть такая штука как mmioInstallIOProc, там как раз через callback-и всё сделано. Вот статья в MS: http://support.microsoft.com/kb/155360
Так что по идее, можно использовать обычный TMediaPlayer, только зарегистрировать собственный формат через mmioInstallIOProc.
Примера на Паскале найти не удалось...
Спасибо большое теперь особых проблем со звуком не будет, но вот с видео фаилами пока беда. Разбираюсь с интерфейсами DirectShow, но пока хорошей документации не нашел. Если кто знает какой нибудь плейер с воспроизведением из мемори потока, киньте пожалуста ссылочку.
Ну насчёт видео предложить ни чего не могу, так как нет опыта в данном направлении, но могу дать очень хорошую консультацию по аудио. Подобную проблему пришлось решать не так давно, потребовалось создать оригинальный 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 в памяти (доступен только "квалифицированным" хакерам)
Так, что надеюсь, эта консультация поможет Вам в решении Вашей проблемы.
Удачи!
Василий похоже всё спутал: и MCI и звуковуху и callback-и. MCI работает только с файлами, ну а "звуковуха с буферами" не имеет отношения к воспроизведению видео. Вобщем слушайте Zloxa, думаю это наиболее правильный путь, хатя сам я такими вещами не занимался.
Прошу прощения за нескромный вопрос, а в каком собственно хелпе делфи видели такой раздел. Может мне что, то не поглазам но в helpe delphi 7 че-то не наблюдаю.(буду смотреть дальше)
Есть хэлп в дельфи Multimedia API Reference, там все есть. Сам этим занимался лет 10 назад, и исходников не сохранилось. С помощью MCI_XXXX функций Вы определяете подходящее устройство, открываете его, запускаете на воспроизведение первый буфер и определяете колбэк, который будет вызван, когда звуковуха будет заканчивать проигрыш первого буфера. В этом колбэке Вы подсунете ей очередной буфер, и так по кругу.
Есть один тупой метод независящий от типа файлов (но при доступе через MMF работать не будет): надо просто подменить в импорте (подробности у Рихтера) нужной библиотеки (какая именно будет в случае с WindowsMediaPlayer я не в курсе) функцию ReadFile (и возможно ещё несколько других) на свою, которая будет выполнять дешифрование.
Где-то были даже готовые решения предназначенные для прозрачного запихивания всех требуемых файлов в один архив, то есть программа думает что читает из папки "Images", а на самом деле ей подсовывают содержимое "resources.dat". Этот метод часто в игрушках используется, чтобы не переписывать готовые библиотеки.
В чистом API не силен. формируете стек буферов, определяете колбэк для закачки очередного буфера и запускаете на воспроизведение. Чем имено осуществляется воспроизведение, и если возможно то хотелось бы увидеть примерчик или cсылку на инфу по возможности исполнения такого метода .
Если воспользоваться чистым API, то задача вполне решаема. Читаете файл, декодируете, формируете стек буферов, определяете колбэк для закачки очередного буфера и запускаете на воспроизведение. Сам таким не занимался. Единственно, этот подход железобетонно подойдет для wav, а для Ваших - м.б. маленький проблем с кодеками и т.п., но это только мои подозрения.
Вобщем этот вариант тоже подходит (задача пока поставленна не конкретно), попытаюсь разобраться с DirectShow filter. Но тема пока не закрыта, с удовольствием почитаю другие советы и предложения!!!
В свое время стояла передомной подобная задача.Вернее задача была сформулирована чуть подругому, необходимо было написать именно некую программную среду, одной из основыных фнукций которой - воспроизведение мультимедиа, однако было жесткое условие, чтобы медиа файлы не могли быть воспроизведены какими либо иными плеерами. Однако за реализацию, я так и не взялся, сроки были очнеь сжатые а дебри там еще те для меня. На сколько я понял, медиаплеер действительно умеет воспроизводить только из файла. Посему, при разборе задачи, было принято решение реализовывать через создание DS Filter, который получает ключ дешифровки от некоего активного процесса (моего приложения). Т.О. Можно будет воспроизводить медиа, только в случае, если запущен мой процесс. Защита так себе, но, думаю 90% случаев воровства предотрватить сможет. Грабануть видео смогут только те люди, которым это действительно НАДО, а не просто ХОЧЕТСЯ.
В свое время много информации подчерпнул из http://groups.google.com/groups/search?q=directshow+filter&qt_s=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.