Can I serve MP3 files with PHP?
Your Content-Disposition should be:
header('Content-Disposition: attachment; filename="sometrack.mp3"');
Not sure if that's the problem though. I would also recommend using readfile
to output the file:
readfile($rSong);
Also, it can't hurt to use an exhaustive Content-Type header, and set the Content-Transfer-Encoding:
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
Setting up apache to serve PHP when an MP3 file is requested
There are some errors in your code:
- A resource can only have one single Content-Type value. So you have to decide what media type you want to use. I suggest
audio/mpeg
. - You forgot to specify the disposition in Content-Disposition. If you just want give a filename and don’t want to change the disposition, use the default value
inline
.
The rest looks fine. But I would also send the 404 status code if the file cannot be found.
$track = "lilly.mp3";
if (file_exists($track)) {
header("Content-Type: audio/mpeg");
header('Content-Length: ' . filesize($track));
header('Content-Disposition: inline; filename="lilly.mp3"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($track);
exit;
} else {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
echo "no file";
}
Play mp3 audio and video with php
Try These Html Tags.
<audio controls>
<source src="horse.ogg" type="audio/ogg">
<source src="horse.mp3" type="audio/mpeg">
</audio>
<video width="320" height="240" controls>
<source src="movie.mp4" type="video/mp4">
<source src="movie.ogg" type="video/ogg">
</video>
PHP Download MP3 files from directory on server
First, header()
should be sent before any output which includes echo
, print_r
, any html, a blank space before the opening tag(eg. <?php
). Refer
to the manual
Second, if you want to response with the content of a file to the browser, your script should not output anything else. Any output besides the content will be considered a part of the content. Unless you send it as multipart and your client is able to handle it.
So, an example
<?php
$fileName = $_GET['file'];
$path = '/directory/contains/mp3/';
$file = $path.$fileName;
if (!file_exists($file)) {
http_response_code(404);
die();
}
header("Cache-Control: private");
header("Content-type: audio/mpeg3");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=".$fileName);
//So the browser can display the download progress
header("Content-Length: ".filesize($file));
readfile($file);
PHP Streaming MP3
Here's what did the trick.
$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/protected_content";
$filename = $_GET['file'];
$file = $dir."/".$filename;
$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";
if(file_exists($file)){
header('Content-type: {$mime_type}');
header('Content-length: ' . filesize($file));
header('Content-Disposition: filename="' . $filename);
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($file);
}else{
header("HTTP/1.0 404 Not Found");
}
How to upload mp3 files
Looks like your mp3 file cannot be uploaded, so it is missing in $_FILES
array. That might be due to its size compared to image files.
Please check upload_max_filesize
and post_max_size
settings from your php.ini
and allow a greater size than your mp3 file.
How to mix/merge 2 mp3 files in PHP?
Based off of this question, you should be able to install FFMPEG onto your server (hopefully not a shared host?) and use
//Reduce background volume, assuming it's input2.mp3
shell_exec('ffmpeg -i input2.mp3 -af "volume=0.3" backround.wav');
//Merge the two
shell_exec('ffmpeg -y -i input1.mp3 -i background.wav -filter_complex amerge -c:a libmp3lame -q:a 4 output.mp3');
Then you can simply serve up the output.mp3
file. If this is being performed by PHP running under apache (or other web host, instead of CLI) you'll need to make sure your www-data
user has read access to the input files, and write access to the output directory.
All your temporary output, like the background, should be saved as .wav
, and only converted back to .mp3
for the final output. Recompressing the audio at each step may result in a very poor final output.
I am making assumptions about how FFMPEG works here, so you may need to consult the documentation for it in order to build a functioning or more efficient set of commands.
Related Topics
Connection Reset by Peer: Mod_Fcgid: Error Reading Data from Fastcgi Server
How to Bulk Update MySQL Data with One Query
Understanding PHP Curl_Multi_Exec
How to Remove Empty Paragraph Tags from String
In PHP How Does Usort() Function Works
Copy File from Remote Server or Url
PHP Session Ids -- How Are They Generated
Best Way to Internationalize Simple PHP Website
How to Convert All Characters to Their HTML Entity Equivalent Using PHP
Add Class="Active" to Active Page Using PHP
Array_Unique and Then Renumbering Keys
How to Employ "If Exists" for Creating or Dropping an Index in MySQL
Getting List Ips from Cidr Notation in PHP
How to Check If Variable Is Array... or Something Array-Like
PHP How to Get the Base Domain/Url
I Have a Base64 Encoded Png, How to Write the Image to a File in PHP