0 Members and 1 Guest are viewing this topic.
{ TAIMPInputPluginHeader }function TAIMPInputPluginHeader.CreateDecoder(AFileName: PWideChar; out ADecoder: IAIMPInputPluginDecoder): LongBool;begin ADecoder := TAIMPInputPluginDecoder.Create(AFileName); Result := True;end;function TAIMPInputPluginHeader.CreateDecoderEx(AStream: IAIMPInputStream; out ADecoder: IAIMPInputPluginDecoder): LongBool;begin Result := False;end;function TAIMPInputPluginHeader.Initialize: LongBool;begin Result := True;end;function TAIMPInputPluginHeader.Finalize: LongBool;begin Result := True;end;function TAIMPInputPluginHeader.GetFileInfo(AFileName: PWideChar; AFileInfo: PAIMPFileInfo): LongBool;begin Result := False;end;function TAIMPInputPluginHeader.GetPluginAuthor: PWideChar;begin Result := 'Test';end;function TAIMPInputPluginHeader.GetPluginFlags: DWORD;begin Result := AIMP_INPUT_FLAG_FILEend;function TAIMPInputPluginHeader.GetPluginInfo: PWideChar;begin Result := 'Test';end;function TAIMPInputPluginHeader.GetPluginName: PWideChar;begin Result := 'Test';end;function TAIMPInputPluginHeader.GetSupportsFormats: PWideChar;begin Result := 'Test|*.test;|';end;{ TAIMPInputPluginDecoder }constructor TAIMPInputPluginDecoder.Create(const AFileName: string);begin FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyRead);end;function TAIMPInputPluginDecoder.DecoderGetFormatType: PWideChar;begin Result := 'MP3';end;function TAIMPInputPluginDecoder.DecoderGetInfo(out ASampleRate, AChannels, ABitDepth: Integer): LongBool;begin Result := False;end;function TAIMPInputPluginDecoder.DecoderGetPosition: Int64;begin Result := FS.Position;end;function TAIMPInputPluginDecoder.DecoderGetSize: Int64;begin Result := FS.Size;end;function TAIMPInputPluginDecoder.DecoderGetTags( AFileInfo: PAIMPFileInfo): LongBool;begin Result := False;end;function TAIMPInputPluginDecoder.DecoderIsRealTimeStream: LongBool;begin Result := False;end;function TAIMPInputPluginDecoder.DecoderIsSeekable: LongBool;begin Result := True;end;function TAIMPInputPluginDecoder.DecoderRead(Buffer: PByte; Size: Integer): Integer;begin FS.Write(Buffer, Size);end;function TAIMPInputPluginDecoder.DecoderSetPosition( const AValue: Int64): LongBool;begin FS.Position := AValue;end;destructor TAIMPInputPluginDecoder.Destroy;begin FS.Free;end;
прямой ссылки на файл нет, воспроизводить как поток не получится.
Затык: если файл скачивается медленнее, чем идёт воспроизведение - воспроизведение моментально обрывается, т.е. оно не ждёт когда файл подгрузится.
свой декодер, который будет ждать подгрузки и потом отдавать данные.
Если прямой ссылки нет, то каким образом вы собираетесь скачивать файл? Как правило сервисы отдают временную прямую ссылку на файл, по которому их могут скачать браузеры и т.п.
А как вы пытались реализовать это?
Но отдавать данные вам нужно уже в PCM-формате, а не в исходном.
1. я бы изучил вопрос на счет прямой ссылки, раз вы можете скачать файл по ссылке, значит вы можете и проиграть его по ссылке.
Базируясь на API для 3.60
Средствами API самого сервера. Оно в отличии от временной ссылки будет работать всегда, а не временно.
Пробовал два варианта:- Забил вторую половину файла "нулями" и воспроизвел. На середине воспроизведение моментально обрывается и начинается сначала.- Удалил вторую половину файла. При воспроизведении продолжительность файла стала в два раза меньше.
Т.е. нет никакой возможности передать данные следующему "подходящему" декодеру?
Так оно уже доступно или нет?
Поясните, пожалуйста. Вы посылаете какой-то запрос, а сервер отдает файл, так?
Нет, такие варианты не подойдут. Правильным в данной ситуации будет морозить вызывающий поток до того момента, пока данные не подоспеют.
Да, доступно. Лежит на сайте в разделе SDK.
А каким подходом это делать? Не начинать воспроизведение, пока не закачается всё? Отслеживать воспроизведение и каким то образом просчитывать, что впереди "обрыв" и приостанавливаться (пока даже не представляю как)?
В новом SDK, ознакомьтесь с разделом FileManager, интерфейсом IAIMPVirtualFile и все, что с ним связано.
Точно, отсылаю запрос - и ответом идут данные. Только сейчас дошло до меня... никакой временной ссылки я не получаю, по крайней мере по протоколу WebDav.
Так если ответом идут данные, нельзя ли подменить временный-URL из плейлиста на этот запрос? Ведь в таком случае плеер сам все декодирует и проиграет.
Точно, заголовки запроса же входят в состав url. Можно попробовать.
Яндекс.Диск не хочет работать через токен в параметрах url, только в теле запроса. Причем остальные сервисы яндекса так умеют.
Правильно ли я понимаю, что токен отправляется через POST запрос? Или он отправляется в поле HTTP-GET заголовка?
Get запрос, в заголовке нужно передать "Authorization: OAuth <токен>".
Указать кастомный параметр можно вот так: [url]\r\nheader1\r\n. \r\n - в дельфях заменяете на #13#10.
webdav.yandex.ru/123.mp3Accept: */*Authorization: OAuth <токен>
Accept%3A+*%2F*Authorization%3A+OAuth+%3C%3F%3F%3F%3F%3F%3E
Accept: */*Authorization: OAuth <токен>