Golang + html5 audio + ios, почему долго грузится дорожка?

В общем проблема такая, отдаю файл для тэга аудио, заголовки все прописал, сервер на golang, при воспроизведении начинает загружаться файл, а воспроизведение начинается только после загрузки половины файла, это примерно 10 сек. Если заливать файл на soundcloud от туда он тоже ждет загрузки половины файла, но 20мб от туда грузит меньше чем за 1сек. в сравнении у меня с сервера грузит 15 мб за 10 сек.

1. Можно ли как то уменьшить порог воспроизведения аудио для тэга
2. Возможно soundcloud как то имитирует загрузку файла и потом подгружает?

name := strings.Replace(r.URL.Path, "/audio/", "", 1)
	path := Helper.GetPathByName(name[0 : len(name)-4])

	buf := bytes.NewBuffer(nil)
	file, err := os.Open(path + name)
	io.Copy(buf, file)
	if err != nil {
		Helper.JsonResponse(w, http.StatusForbidden, err.Error())
		return
	}

	w.Header().Set("Connection", "keep-alive")
	w.Header().Set("Accept-Ranges","bytes")
	w.Header().Set("Content-Type", "audio/mpeg")
	file.Close()

	fi := buf.Bytes()

	rangeString := r.Header.Get("range")
	start := 0
	end := len(fi)
	if rangeString == "" {
		w.Header().Set("Content-Length", strconv.Itoa(len(buf.Bytes()[start:end])))
		w.WriteHeader(200)
		w.Write(fi[start:end])
		return
	}

	str:=strings.Split(rangeString[len("bytes="):], "-")
	if str[0] != "" {
		start, err = strconv.Atoi(str[0])
	}
	if str[1] != "" {
		end, err = strconv.Atoi(str[1])
	}

	strRange := Helper.ParseRangeToStr(int64(start), int64(end), int64(len(fi)))
	w.Header().Set("Content-Range", strRange)

	end += 1
	contentLength := len(buf.Bytes()[start:end])
	w.Header().Set("Content-Length", strconv.Itoa(contentLength))

	w.WriteHeader(206)
	w.Write(fi[start:end])


Важно то что похоже проблема в самом плеере, потому что он ожидает загрузки части файла и только потом начинает играть
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 2
@MikeMoore
Что бы решить проблему - нужно видеть код
Ответ написан
@falconandy
Судя по коду, вы загружаете содержимое файла полностью на каждый запрос (io.Copy(buf, file)) - даже если затребована только часть файла.
Не стоит изобретать велосипед - скорее всего, подойдет библиотечная функция http.ServeFile
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
R52.RU Нижний Новгород
от 30 000 до 50 000 руб.
Sveak Барнаул
от 50 000 руб.
HTML Academy Санкт-Петербург
от 150 000 до 180 000 руб.