HTML< audio>流不能在苹果的iOS Safari和iPhone上播放-https://sidcloud.net

kgqe7b3p  于 2023-10-21  发布在  iOS
关注(0)|答案(2)|浏览(138)

我需要一些帮助我的网页。我流wav文件和只有在苹果的软件音乐不播放。我在互联网上寻找解决方案(其他人的问题),并尝试了不同的解决方案,但没有成功。也许最好的方法是检查我的网站:https://sidcloud.net。我使用htmlaudio html元素与我的控制。流媒体似乎正在启动(从后端的Angular 来看),但audio html元素不播放它。有谁能帮忙看看这个网站吗?提前感谢!Bartek

trnvg8h3

trnvg8h31#

让它工作\o/。我必须正确处理字节范围。苹果的软件使用范围功能,所以我不得不满足其需求:).下面是我在Golang/GIN中的REST API函数:

func AudioGet(c *gin.Context) {

// Typ połączania
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Connection", "Keep-Alive")
c.Header("Transfer-Encoding", "identity")
c.Header("Accept-Ranges", "bytes")

// Odczytujemy parametr - numer muzy
id := c.Param("id")
filenameWAV := cacheDir + id + ".wav"

var size int64
if fileExists(filenameWAV) {
    s, err := fileSize(filenameWAV)
    if ErrCheck(err) {
        log.Println("[GIN:AudioGet] Size of file " + filenameWAV + " = " + strconv.Itoa(int(s)))
        size = s
    } else {
        log.Println("[GIN:AudioGet] Can't read size of file " + filenameWAV)
        c.JSON(http.StatusInternalServerError, "Can't read size of file")
        return
    }
} else {
    log.Println("[GIN:AudioGet] No WAV file " + filenameWAV)
    c.JSON(http.StatusInternalServerError, "No WAV file")
    return
}

//
// Analiza nagłówka - ile bajtów mamy wysłać
//
bytesToSend := 0
bytesToSendStart := 0
bytesToSendEnd := 0
headerRange := c.GetHeader("Range")
log.Println("[GIN:AudioGet2] Header:Range = " + headerRange)
if len(headerRange) > 0 {
    headerRangeSplitted1 := strings.Split(headerRange, "=")

    if len(headerRangeSplitted1) > 0 {
        log.Println("[GIN:AudioGet2] range in " + headerRangeSplitted1[0])

        if len(headerRangeSplitted1) > 1 {
            headerRangeSplitted2 := strings.Split(headerRangeSplitted1[1], "-")
            if len(headerRangeSplitted2) > 0 {
                log.Println("[GIN:AudioGet2] start = " + headerRangeSplitted2[0])
                if len(headerRangeSplitted2) > 1 {
                    log.Println("[GIN:AudioGet2] end = " + headerRangeSplitted2[1])
                    bytesToSendStart, err := strconv.Atoi(headerRangeSplitted2[0])
                    if ErrCheck2(err) {
                        bytesToSendEnd, err := strconv.Atoi(headerRangeSplitted2[1])
                        if ErrCheck2(err) {
                            bytesToSend = bytesToSendEnd - bytesToSendStart + 1
                        }
                    }
                }
            }
        }
    }
}

log.Println("[GIN:AudioGet2] Bytes to send " + strconv.Itoa(bytesToSend))
log.Println("[GIN:AudioGet2] From " + strconv.Itoa(bytesToSendStart) + " to " + strconv.Itoa(bytesToSendEnd))

if bytesToSend > 0 {
    c.Header("Content-length", strconv.Itoa(bytesToSend))
    c.Header("Content-range", "bytes "+strconv.Itoa(bytesToSendStart)+"-"+strconv.Itoa(bytesToSendEnd)+"/"+strconv.Itoa(int(size)))
    size = int64(bytesToSend)
}

// Streaming LOOP...
// ----------------------------------------------------------------------------------------------

// Otwieraamy plik - bez sprawdzania błędów
file, err := os.Open(filenameWAV)
defer file.Close()
if ErrCheck(err) {
    // Info o wejściu do GET
    log.Println("[GIN:AudioGet] Sending " + id + "...")

    p := make([]byte, size)
    file.ReadAt(p, int64(bytesToSendStart))
    file.Close()
    if bytesToSend > 0 {
        c.Data(http.StatusPartialContent, "audio/wav", p)
    } else {
        c.Data(http.StatusOK, "audio/wav", p)
    }
} else {
    log.Println("[GIN:AudioGet] Can't open file " + filenameWAV)
}

}
这里是log:

2020/05/04 14:28:59 [GIN:AudioGet] Size of file cache/190651.wav = 26460044
2020/05/04 14:28:59 [GIN:AudioGet2] Header:Range = bytes=0-1
2020/05/04 14:28:59 [GIN:AudioGet2] range in bytes
2020/05/04 14:28:59 [GIN:AudioGet2] start = 0
2020/05/04 14:28:59 [GIN:AudioGet2] end = 1
2020/05/04 14:28:59 [GIN:AudioGet2] Bytes to send 2
2020/05/04 14:28:59 [GIN:AudioGet2] From 0 to 0
2020/05/04 14:28:59 [GIN:AudioGet] Sending 190651...
2020/05/04 14:29:00 [GIN:AudioGet] Size of file cache/190651.wav = 26460044
2020/05/04 14:29:00 [GIN:AudioGet2] Header:Range = bytes=0-65535
2020/05/04 14:29:00 [GIN:AudioGet2] range in bytes
2020/05/04 14:29:00 [GIN:AudioGet2] start = 0
2020/05/04 14:29:00 [GIN:AudioGet2] end = 65535
2020/05/04 14:29:00 [GIN:AudioGet2] Bytes to send 65536
2020/05/04 14:29:00 [GIN:AudioGet2] From 0 to 0
2020/05/04 14:29:00 [GIN:AudioGet] Sending 190651...
2020/05/04 14:29:00 [GIN:AudioGet] Size of file cache/190651.wav = 26460044
2020/05/04 14:29:00 [GIN:AudioGet2] Header:Range = bytes=26411008-26460043
2020/05/04 14:29:00 [GIN:AudioGet2] range in bytes
2020/05/04 14:29:00 [GIN:AudioGet2] start = 26411008
2020/05/04 14:29:00 [GIN:AudioGet2] end = 26460043
2020/05/04 14:29:00 [GIN:AudioGet2] Bytes to send 49036
2020/05/04 14:29:00 [GIN:AudioGet2] From 0 to 0
2020/05/04 14:29:00 [GIN:AudioGet] Sending 190651...
2020/05/04 14:29:01 [GIN:AudioGet] Size of file cache/190651.wav = 26460044
2020/05/04 14:29:01 [GIN:AudioGet2] Header:Range = bytes=65536-26411007
2020/05/04 14:29:01 [GIN:AudioGet2] range in bytes
2020/05/04 14:29:01 [GIN:AudioGet2] start = 65536
2020/05/04 14:29:01 [GIN:AudioGet2] end = 26411007
2020/05/04 14:29:01 [GIN:AudioGet2] Bytes to send 26345472
2020/05/04 14:29:01 [GIN:AudioGet2] From 0 to 0
2020/05/04 14:29:01 [GIN:AudioGet] Sending 190651...

所以,正如你所看到的,苹果浏览器首先要求前两个字节,然后是c.a. 64 KB,然后是音乐文件的其余部分。

vd8tlhqk

vd8tlhqk2#

我发现这一点,而挣扎与同样的问题,真的浪费了很多时间在它!我也开始自己实现这一点,以你为榜样(谢谢!),但最后真的很幸运地遇到了事实,GoLang的http库实际上可以为您做到这一点。因此,您可以执行以下任一操作:

func AudioGet(c *gin.Context) {
    id := c.Param("id")
    filenameWAV := cacheDir + id + ".wav"
    file := goGetFile(filenameWAV) // assuming goGetFile returns []byte
    http.ServeContent(c.Writer, c.Request, "recording.wav", time.Now(), bytes.NewReader(file))
}

或者,如果文件在文件系统上,甚至:

func AudioGet(c *gin.Context) {
    id := c.Param("id")
    filenameWAV := cacheDir + id + ".wav"
    http.ServeFile(c.Writer, c.Request, filenameWAV) // assuming filenameWAV is the location
}

下面是它的文档:https://golang.org/pkg/net/http/#ServeContent(ServeFile位于其正下方)

相关问题