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])


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

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

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