HTML5 <аудио> прямая трансляция Safari по сравнению с нет

33
задан Peter Parente 3 January 2010 в 20:14
поделиться

4 ответа

Для этого можно использовать API-интерфейс Google Maps . Все, что вам нужно сделать, это создать пользовательские плитки карты . Здесь имеется хороший учебник .

EDIT : только что найден другой сайт , использующий тот же метод.

Я также нашел несколько альтернативных решений, которые не основаны на Google Maps API (1-е - лучшее, на мой взгляд):

  1. Seadragon от Microsoft
  2. http://ditchnet.org/dhtmlgallery/slider.html
  3. http://www.oneblackbear.com/zoom/index.html
  4. http://www.rborn.info/moozoom.php

и другие вопросы по этой теме:

  1. Зумирование изображения с помощью javascript?
  2. Javascript для зумирования и панорамирования изображения
  3. Javascript/jQuery image zoom plugin

EDIT: Если у вас действительно большие изображения, вы можете загрузить файлы в GigaPan (SM) и внедрить их в свой веб-сайт.

-121--2921037-

Наборов Стиль окна - Нет и Режим изменения размера - NoResize (в XAML или на панели свойств).

-121--4691076-

Можете ли вы опубликовать заголовки, отправленные сервером, как с помощью скрипта 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 , поэтому вам придется свернуть свой собственный диапазон обработки.

34
ответ дан 27 November 2019 в 18:33
поделиться

Старая тема, но все еще допустимый в 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);
2
ответ дан 27 November 2019 в 18:33
поделиться

У меня такая же проблема. Ключевым моментом является заголовок Content-Range. Все работает нормально после того, как я добавляю его в mp3-output php.

2
ответ дан 27 November 2019 в 18:33
поделиться

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);
2
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: