Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 551509
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 13, 20262026-05-13T11:24:05+00:00 2026-05-13T11:24:05+00:00

I’m attempting to embed an HTML5 audio element pointing to MP3 or OGG data

  • 0

I’m attempting to embed an HTML5 audio element pointing to MP3 or OGG data served by a PHP file . When I view the page in Safari, the controls appear, but the UI says “Live Broadcast.” When I click play, the audio starts as expected. Once it ends, however, I can’t start it playing again by clicking play. Even using the JS API on the audio element and setting currentTime to 0 fails with an index error exception.

I suspected the headers from the PHP script were the problem, particularly missing a content length. But that’s not the case. The response headers include a proper Content- Length to indicate the audio has finite size. Furthermore, everything works as expected in Firefox 3.5+. I can click play on the audio element multiple times to hear the sound replay.

If I remove the PHP script from the equation and serve up a static copy of the MP3 file, everything works fine in Safari.

Does this mean Safari is treating audio src URLs with query parameters differently than URLs that don’t have them? Anyone have any luck getting this to work?

My simple example page is:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <audio controls autobuffer>
      <source src="say.php?text=this%20is%20a%20test&format=.ogg" />
      <source src="say.php?text=this%20is%20a%20test&format=.mp3" />
    </audio>
  </body>
</html>

HTTP Headers from PHP script:

HTTP/1.x 200 OK
Date: Sun, 03 Jan 2010 15:39:34 GMT
Server: Apache
X-Powered-By: PHP/5.2.10
Content-Length: 8993
Keep-Alive: timeout=2, max=98
Connection: Keep-Alive
Content-Type: audio/mpeg

HTTP Headers from direct file access:

HTTP/1.x 200 OK
Date: Sun, 03 Jan 2010 20:06:59 GMT
Server: Apache
Last-Modified: Sun, 03 Jan 2010 03:20:02 GMT
Etag: "a404b-c3f-47c3a14937c80"
Accept-Ranges: bytes
Content-Length: 8993
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: audio/mpeg

I tried hard-coding the Accept-Ranges header into the script too, but no luck.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-13T11:24:06+00:00Added an answer on May 13, 2026 at 11:24 am

    Can you post the headers sent by the server both with and without the PHP script? I’m wondering if the PHP script is sending a different Content-Type than serving the files normally.

    It would also be a good idea to specify the type attribute on the source elements, so the browser does not have to download both clips to determine if it can play them.

    I cannot reproduce your problem. I have tried to recreate the problem in Safari 4.0.4, and the current WebKit nightly, with the following test page. I am simply using mod_rewrite to dispatch to different formats based on a parameter instead of PHP, but I don’t think that should make a difference, unless somehow PHP is modifying the file.

    <!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>
    

    Can you try my example out and let me know if it works for you?

    edit Ah. After poking around at it a bit more, it appears that the problem is due to an odd way that the <audio> element in Safari behaves in attempting to determine the size of the content.

    Here’s an excerpt from a packet capture of Safari upon encountering an <audio> element pointing to a file served directly from Apache. As you can see, it first tries to fetch the first two bytes of the media, presumably so it can get a Content-Length back, and possibly other headers. It then tries to fetch the whole thing. Then, inexplicably, it tries to fetch the first two bytes again, but passes appropriate caching headers to get a “304 Not Modified” response. And finally, still inexplicably, it fetches the last 3440 bytes of the file all over again. It does all of these in separate TCP connections, which adds considerable overhead, in addition to the overhead of fetching the data a couple of times.

    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
    

    Anyhow, on to how it deals with the output of your PHP script. Here, Safari again tries to download the first two bytes, but your script ignores the Range request and returns the whole thing. Apparently, WebKit doesn’t like that, and so it tries again, without the Range request. Again, your script sends the full contents. Safari now tries once more, adding an Icy-Metadata header, which indicates it thinks that it’s downloading a stream and wants streaming metadata to be sent. It finally accepts the output of that, and the <audio> element can play.

    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
    

    In summary, it appears that Safari (or more accurately, QuickTime, which Safari uses to handle all media and media downloading) has a completely braindamaged approach to downloading media. Something in the way you send your data back, probably the fact that you don’t respond to Range requests, makes it think that you are sending streaming media, causing it to download the content repeatedly (though even when confronted with a server that does respond to a Range request, it still does several more requests than it really needs to).

    My advice would be to try to respond appropriately to Range requests; when serving up media, browsers will likely use them to try to minimize bandwidth, by only buffering as much as they need to be able to play through (although have the autobuffer attribute which indicates that you would like them to buffer the whole thing, browsers may ignore that). I would recommend using X-Sendfile to let Apache deal with serving the file, caching, and range requests, but you appear to be on Dreamhost, which doesn’t have mod_xsendfile installed, so you’re going to have to roll your own Range handling.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.