Для этого можно использовать API-интерфейс Google Maps . Все, что вам нужно сделать, это создать пользовательские плитки карты . Здесь имеется хороший учебник .
EDIT : только что найден другой сайт , использующий тот же метод.
Я также нашел несколько альтернативных решений, которые не основаны на Google Maps API (1-е - лучшее, на мой взгляд):
и другие вопросы по этой теме:
EDIT: Если у вас действительно большие изображения, вы можете загрузить файлы в GigaPan (SM) и внедрить их в свой веб-сайт.
-121--2921037- Наборов Стиль окна
- Нет
и Режим изменения размера
- NoResize
(в XAML или на панели свойств).
Можете ли вы опубликовать заголовки, отправленные сервером, как с помощью скрипта PHP, так и без него? Интересно, отправляет ли скрипт PHP другой Content-Type
, чем обычно обслуживающий файлы.
Также рекомендуется указать атрибут type
в элементах source
, поэтому браузер не должен загружать оба клипа, чтобы определить, может ли он воспроизводить их.
Я не могу воспроизвести вашу проблему. Я попытался воссоздать проблему в Safari 4.0.4 и текущем WebKit ночью, с после тестовой страницы . Я просто использую mod_rewrite для отправки в различные форматы на основе параметра вместо PHP, но я не думаю, что это должно иметь значение, если только каким-то образом PHP не модифицирует файл.
<!DOCTYPE html>
<title>Auido test</title>
<audio controls autobuffer>
<source src="gnossienne-no-1?foo=bar&format=.mp4">
<source src="gnossienne-no-1?foo=bar&format=.ogg">
</audio>
Можете ли вы попробовать мой пример и дать мне знать, если он работает для вас?
изменить Ах. После того, как вы набросились на него немного больше, оказалось, что проблема связана с нечетным путем, что элемент < аудио >
в Safari ведет себя, пытаясь определить размер содержимого.
Вот отрывок из захвата пакетов Safari при обнаружении элемента < аудио >
, указывающего на файл, обслуживаемый непосредственно из Apache. Как вы видите, он сначала пытается получить первые два байта носителя, предположительно, так что он может получить Content-Length назад, и, возможно, другие заголовки. Затем он пытается достать все это. Затем, что необъяснимо, он пытается снова извлечь первые два байта, но передает соответствующие кэширующие заголовки, чтобы получить ответ «304 Not Modified». И, наконец, все еще необъяснимо, он снова получает последние 3440 байт файла. Все это выполняется в отдельных TCP-соединениях, что добавляет значительные накладные расходы в дополнение к накладным расходам на получение данных пару раз.
GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1 Host: ephemera.continuation.org Range: bytes=0-1 Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* Accept-Encoding: identity Cookie: [redacted] HTTP/1.1 206 Partial Content Date: Tue, 05 Jan 2010 02:12:48 GMT Server: Apache Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT ETag: "b2a80ad-11f6-47c6139aaa800" Accept-Ranges: bytes Content-Length: 2 Content-Range: bytes 0-1/4598 Connection: close Content-Type: audio/mpeg # 2 bytes of data GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1 Host: ephemera.continuation.org Range: bytes=0-4597 Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* Accept-Encoding: identity Cookie: [redacted] HTTP/1.1 206 Partial Content Date: Tue, 05 Jan 2010 02:12:48 GMT Server: Apache Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT ETag: "b2a80ad-11f6-47c6139aaa800" Accept-Ranges: bytes Content-Length: 4598 Content-Range: bytes 0-4597/4598 Connection: close Content-Type: audio/mpeg # 4598 bytes of data GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1 Host: ephemera.continuation.org Range: bytes=0-1 Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* Accept-Encoding: identity Cookie: [redacted] If-None-Match: "b2a80ad-11f6-47c6139aaa800" If-Modified-Since: Tue, 05 Jan 2010 02:02:08 GMT HTTP/1.1 304 Not Modified Date: Tue, 05 Jan 2010 02:12:49 GMT Server: Apache Connection: close ETag: "b2a80ad-11f6-47c6139aaa800" # no data GET /stackoverflow/audio-test/say-noid3?foo=bar&format=.mp3 HTTP/1.1 Host: ephemera.continuation.org Range: bytes=1158-4597 Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* Accept-Encoding: identity Cookie: [redacted] HTTP/1.1 206 Partial Content Date: Tue, 05 Jan 2010 02:12:49 GMT Server: Apache Last-Modified: Tue, 05 Jan 2010 02:02:08 GMT ETag: "b2a80ad-11f6-47c6139aaa800" Accept-Ranges: bytes Content-Length: 3440 Content-Range: bytes 1158-4597/4598 Connection: close Content-Type: audio/mpeg # 3440 bytes of data
В любом случае, о том, как это связано с выводом скрипта PHP. Здесь Safari снова пытается загрузить первые два байта,но сценарий игнорирует запрос Range
и возвращает всю вещь. Видимо, WebKit это не нравится, и поэтому он пытается снова, без запроса Диапазон
. Опять же, сценарий отправляет полное содержимое. Теперь Safari еще раз пытается добавить заголовок Icy-Metadata
, который указывает, что он считает, что загружает поток, и хочет, чтобы потоковые метаданные были восприняты. Наконец, он принимает выходные данные этого, и элемент < аудио >
может воспроизводиться.
GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1 Host: tts.mindtrove.info Range: bytes=0-1 Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* Accept-Encoding: identity HTTP/1.1 200 OK Date: Tue, 05 Jan 2010 02:14:28 GMT Server: Apache X-Powered-By: PHP/5.2.10 Content-Length: 4598 Connection: close Content-Type: audio/mpeg # 4598 bytes of data GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1 Host: tts.mindtrove.info Connection: close User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Accept: */* HTTP/1.1 200 OK Date: Tue, 05 Jan 2010 02:14:28 GMT Server: Apache X-Powered-By: PHP/5.2.10 Content-Length: 4598 Connection: close Content-Type: audio/mpeg # 4598 bytes of data GET /say.php?text=this%20is%20a%20test&format=.mp3 HTTP/1.1 Host: tts.mindtrove.info Accept: */* User-Agent: Apple Mac OS X v10.6.2 CoreMedia v1.0.0.10C540 Icy-Metadata: 1 Connection: close HTTP/1.1 200 OK Date: Tue, 05 Jan 2010 02:14:28 GMT Server: Apache X-Powered-By: PHP/5.2.10 Content-Length: 4598 Connection: close Content-Type: audio/mpeg # 4598 bytes of data
Таким образом, представляется, что Safari (или, точнее, QuickTime, который Safari использует для работы со всеми носителями и загрузкой носителей) имеет полностью поврежденный подход к загрузке носителей. Что-то в путь отправки данных обратно, возможно, тот факт, что вы не отвечаете на запросы Range
, заставляет его думать, что вы отправляете потоковый носитель, заставляя его загружать контент повторно (хотя даже при взаимодействии с сервером, который отвечает на запрос Range
, он выполняет несколько запросов больше, чем ему действительно нужно).
Мой совет состоит в том, чтобы попытаться надлежащим образом ответить на запросы диапазона
; при обслуживании мультимедиа, браузеры, скорее всего, будут использовать их, чтобы попытаться минимизировать полосу пропускания, только путем буферизации столько, сколько они должны быть в состоянии играть через (хотя имеют autobuffer
атрибут, который указывает, что вы хотели бы, чтобы они буферизовали всю вещь, браузеры могут игнорировать это). Я бы рекомендовал использовать X-Sendfile
, чтобы разрешить Apache обрабатывать запросы на файл, кэширование и диапазон, но вы, похоже, находитесь на Dreamhost, который не имеет установленного mod _ xsendfile
, поэтому вам придется свернуть свой собственный диапазон
обработки.
Старая тема, но все еще допустимый в 2019. Мы наконец нашли решение... Ниже Сценария PHP образец рассмотрит запрос заголовка "Диапазона" Safari.
$bytes_total = strlen($data);
if (isset( Старая тема, но все еще допустимый в 2019. Мы наконец нашли решение... Ниже Сценария PHP образец рассмотрит запрос заголовка "Диапазона" Safari.
[110]SERVER['HTTP_RANGE'])) {
$byte_range = explode('-',trim(str_ireplace('bytes=','', Старая тема, но все еще допустимый в 2019. Мы наконец нашли решение... Ниже Сценария PHP образец рассмотрит запрос заголовка "Диапазона" Safari.
[110]SERVER['HTTP_RANGE'])));
$byte_from = $byte_range[0];
$byte_to = ($byte_range[1]+1);
$data = substr($data,$byte_from,$byte_to);
header('HTTP/1.1 206 Partial Content');
}
else {
$byte_from = 0;
$byte_to = $bytes_total;
}
$length = strlen($data);
header('Content-type: '.$content_type);
header('Accept-Ranges: bytes');
header('Content-length: ' . $length);
header('Content-Range: bytes '.$byte_from.'-'.$byte_to.'/'.$bytes_total);
header('Content-Transfer-Encoding: binary');
print($data);
У меня такая же проблема. Ключевым моментом является заголовок Content-Range. Все работает нормально после того, как я добавляю его в mp3-output php.
Pochang прав. Включение заголовка Content-Range в ответ PHP заставит Safari вести себя правильно. Это также позволяет искать (media.currentTime = 0;) без страшного INDEX_SIZE_ERR в Safari, но не в Chrome.
Код PHP для заголовка:
$len = strlen( $data );
$shortlen = $len - 1;
header( 'Content-Range: bytes 0-'.$shortlen.'/'.$len);