I've searched and googled but I could not find much in the way of installing, setting up and testing ffmpeg/flvtool2 on Windows when it is to be used with PHP for a website.
Can one of you who's already done this help me, please
I am putting together a website that will let users upload small videos so they can be streamed on the website but I can't get a particular script to work. It does not even recognize the paths to ffmpeg or flvtool2.
The server is Windows 2003 R2 running Apache 2.20 and PHP 5.3.8. I found the correct binaries of ffmpeg and flvtool2 and I have installed them. I also installed ffmpeg-php and loaded the extension.
Below is a screencap of phpinfo():
The paths below are correct and also come from phpinfo():
C:\ffmpeg\bin;C:\flvtool2\bin;C:\ffmpeg\ffmpeg-php
If I use the following script to test ffmpeg, it works:
Can someone please provide me with a different, simple PHP test script with debugging that will test both ffmpeg and flvtool2?PHP Code:
<?php
$ffmpegpath = "ffmpeg.exe";
$input = '1.mp4';
$output = '1.jpg';
if (make_jpg($input, $output)){
echo 'success';
}else{
echo 'bah!';
}
function make_jpg($input, $output, $fromdurasec="01") {
global $ffmpegpath;
if(!file_exists($input)) return false;
$command = "$ffmpegpath -i $input -an -ss 00:00:$fromdurasec -r 1 -vframes 1 -f mjpeg -y $output";
@exec( $command, $ret );
if(!file_exists($output)) return false;
if(filesize($output)==0) return false;
return true;
}
?>
I don't know PHP or ffmpeg/flvtool2 well enough to write it myself. I've already tried but it did not work and I don't know if it's because something is wrong with my installation or the coding. I need something that's proven to work.
The problem I have with the video sharing script I want to use is that the script does seem to like the path to ffmpeg or flvtool2 so I can't even get past the first step to setting it up.
Here's a screencap of the first setup step of the video script:
Before I enter the paths:
After I enter the correct paths:
Here's the code for that part of the script:
I don't know how to debug. Also, the flvtool2 package I downloaded contains 'C:/flvtool2/bin/flvtool2' and 'C:/flvtool2/flvtool2.exe'. Which am I supposed to use?PHP Code:
<?php
$page = "admin_install_vid";
include "admin_header.php";
if(!isset($_GET['ffmpeg_path']) OR !isset($_GET['flvtool2_path']))
{
// show form
if(in_array('exec', explode(',', ini_get('disable_functions'))))
{
// exec is disabled on this server
$smarty->assign('result', 'The php function "exec" [<a href="http://www.php.net/manual/en/function.exec.php" target="_blank">http://www.php.net/manual/en/function.exec.php</a>] is disabled on this server.<br><br>Please enable this function by editing the "disable_functions" variable in your php.ini file');
}
}
else
{
// verify that ffmpeg is installed
$ffmpeg_path = escapeshellcmd(strip_tags($_GET['ffmpeg_path']));
$is = false;
$result = null;
exec($ffmpeg_path.' -version', $result);
if(empty($result) || !isset($result[0]) || !strstr($result[0], 'FFmpeg'))
{
$is = false;
$smarty->assign('result', 'The FFmpeg installation could not be found. Try again.');
}
else
{
$is = true;
}
// verify that ffmpeg is installed
$flvtool2_path = escapeshellcmd(strip_tags($_GET['flvtool2_path']));
$result = null;
exec($flvtool2_path.' -H', $result2);
if(empty($result2) || !isset($result2[0]) || !strstr($result2[0], 'FLVTool2'))
{
$is = false;
$smarty->assign('result2', 'The FLVTool2 installation could not be found. Try again.');
}
else
{
$is = true;
}
}
if ($is == true) { $smarty->assign('is', 'Your server has got all All-in-one Video Plugin requirements.'); }
$smarty->assign('flvtool2_path', $flvtool2_path);
$smarty->assign('ffmpeg_path', $ffmpeg_path);
include "admin_footer.php";
?>
I've tried specifying both files for the flvtool2 path but it makes no difference.
+ Reply to Thread
Results 1 to 27 of 27
-
-
Try change the path slashes to double backslashes like
Code:c:\\ffmpeg\\bin\\ffmpeg.exe c:\\flvtool2\\flvtool2.exe
-
Thanks for the response
I already tried that. Made no difference. It also populateed the input box with...
C:^\^\^\^\ ffmpeg^\^\^\^\bin^\^\^\^\ ffmpeg.exe
...after I click on the validate button.
I'm not sure what I did, but now the same path to flvtool2 is being accepted.
I tried that path earlier and it did not workLast edited by jeffshead; 18th Oct 2011 at 16:12.
-
Also, forward slashes in a Windows path is weird. I'd expect backslashes, and for them to be escaped as Baldrick has already mentioned.
Not sure why doing that has added odd characters to the input box.
Here's a simple php script to check the paths:
PHP Code:<?php
// check to see if paths are valid
$ffmpeg_path = "path_to_ffmpeg";
$ffvtool2_path = "path_to_ffvtool2";
if(file_exists($ffmpeg_path)) {
echo "Found ffmpeg<br>\n";
} else {
echo "Can't find ffmpeg<br>\n";
}
if(file_exists($ffvtool2_path)) {
echo "Found ffvtool2<br>\n";
} else {
echo "Can't find ffvtool2<br>\n";
}
?>Last edited by intracube; 18th Oct 2011 at 17:00.
-
Yeah, the path to ffmpeg is correct and so is the case.
I realize the path to flvtool2 is different in the screencaps. I tried both paths many times. The flvtool2 folder contains the following two files:
C:/flvtools/bin/flvtools2
C:/flvtools/flvtools.exe
I was not sure of which one to use but now I guess the one with the .exe extention is the correct one.
Only forward slashes works. I've also had to use forward slashes for other PHP scripts.
I'm at a complete loss here. -
I might have found an issue with the script for the plugin installation.
I don't totally understand what the script is doing, but from what I can see it tries to run ffmpeg with the -version parameter, and expects a certain response. Specifically, it expects the response from ffmpeg to start with the string 'FFmpeg'.
When I try ffmpeg with the -version option, it returns a string starting with 'ffmpeg' - note that it's all lower case.
I'm running this on Linux and I don't know if the Windows version of ffmpeg differs in operation, but you could try replacing line 23:
PHP Code:if(empty($result) || !isset($result[0]) || !strstr($result[0], 'FFmpeg'))
PHP Code:if(empty($result) || !isset($result[0]) || !strstr($result[0], 'ffmpeg'))
-
Same here when I run the command directly on the server.
When I change 'FFmpeg' to all lower case and test, the browser acts like it's waiting for the page to finish loading and none of the links work on the website. Neither a page refresh nor opening a new tab helps and it does this with any browser. I have to totally close the browser and reopen it. Then when I browse back to the page, it does the same thing.Wierd.
Now I'm really confused. Maybe that fixed the code but now I'm having an issue with ffmpeg itself??? -
Where did you get the 'All-in-one video plugin' utility/script from? If I have time tomorrow, I'll try and go through it again and look at the associated files that comes with it.
Did you try the code in post #5? What was the result? -
I used the script from post #5 and it says the paths are correct.
I re-downloaded and re-installed both of the following packages:
http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-git-6bca574-win32-static.7z
http://x32.elijst.nl/ffmpeg-php53-win32-vc9-all.zip
Here is the output from the ffmpeg command line version check:
Code:C:\ffmpeg>ffmpeg -version ffmpeg version N-33698-g6bca574, Copyright (c) 2000-2011 the FFmpeg developers built on Oct 16 2011 13:33:14 with gcc 4.6.1 configuration: --enable-gpl --enable-version3 --enable-runtime-cpudetect --ena ble-avisynth --enable-bzlib --enable-frei0r --enable-libopencore-amrnb --enable- libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --ena ble-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --en able-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib libavutil 51. 21. 0 / 51. 21. 0 libavcodec 53. 20. 1 / 53. 20. 1 libavformat 53. 16. 0 / 53. 16. 0 libavdevice 53. 4. 0 / 53. 4. 0 libavfilter 2. 43. 6 / 2. 43. 6 libswscale 2. 1. 0 / 2. 1. 0 libpostproc 51. 2. 0 / 51. 2. 0 ffmpeg N-33698-g6bca574 libavutil 51. 21. 0 / 51. 21. 0 libavcodec 53. 20. 1 / 53. 20. 1 libavformat 53. 16. 0 / 53. 16. 0 libavdevice 53. 4. 0 / 53. 4. 0 libavfilter 2. 43. 6 / 2. 43. 6 libswscale 2. 1. 0 / 2. 1. 0 libpostproc 51. 2. 0 / 51. 2. 0
I also changed the All-In-One script's code back to all lowercase 'ffmpeg'. Now the browser does not act all weird and the All-In-One script regonizes the paths, uploads the videos but it does not convert them.
Maybe the ffmpeg and flvtool2 install needs to be fully tested before working on the All-In-One script. I just don't know how to test.
Nothing happens (just a blank screen with no errors in any logs) when I use the following script to test:
PHP Code:<?php
// Set our source file
$srcFile = "C:/test/clock.avi";
$destFile = "C:/test/clock.flv";
$ffmpegPath = "C:/ffmpeg/bin/ffmpeg.exe";
$flvtool2Path = "C:/flvtool2/flvtool2.exe";
// Create our FFMPEG-PHP class
$ffmpegObj = new ffmpeg_movie($srcFile);
// Save our needed variables
$srcWidth = makeMultipleTwo($ffmpegObj->getFrameWidth());
$srcHeight = makeMultipleTwo($ffmpegObj->getFrameHeight());
$srcFPS = $ffmpegObj->getFrameRate();
$srcAB = intval($ffmpegObj->getAudioBitRate()/1000);
$srcAR = $ffmpegObj->getAudioSampleRate();
// Call our convert using exec()
exec($ffmpegPath . " -i " . $srcFile . " -ar " . $srcAR . " -ab " . $srcAB . " -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $destFile . " | " . $flvtool2Path . " -U stdin " . $destFile);
// Make multiples function
function makeMultipleTwo ($value)
{
$sType = gettype($value/2);
if($sType == "integer")
{
return $value;
} else {
return ($value-1);
}
}
?>Last edited by jeffshead; 19th Oct 2011 at 08:16.
-
You haven't said where you got the all-in-one script from, and I can't tell what it's trying to do from the code you've posted.
Does the place where you got the code have a support forum or similar? You could try asking there for guidance. If you do, point out the issue with the installation script re FFmpeg/ffmpeg string. It definitely looks like a bug to me. ISTR older versions of ffmpeg *did* report the version with an uppercase FFmpeg string.
Instead of changing the FFmpeg string to ffmpeg, replacing strstr() with stristr() might be a more elegent way to fix the bug.
Nothing happens (just a blank screen with no errors in any logs) when I use the following script to test:
I haven't done anything with php classes, so I can't really help with that aspect, but try this:
PHP Code:<?php
// Set our source file
$srcFile = "C:/test/clock.avi";
$destFile = "C:/test/clock.flv";
$ffmpegPath = "C:/ffmpeg/bin/ffmpeg.exe";
$flvtool2Path = "C:/flvtool2/flvtool2.exe";
// Create our FFMPEG-PHP class
$ffmpegObj = new ffmpeg_movie($srcFile);
// Save our needed variables
$srcWidth = makeMultipleTwo($ffmpegObj->getFrameWidth());
$srcHeight = makeMultipleTwo($ffmpegObj->getFrameHeight());
$srcFPS = $ffmpegObj->getFrameRate();
$srcAB = intval($ffmpegObj->getAudioBitRate()/1000);
$srcAR = $ffmpegObj->getAudioSampleRate();
// Call our convert using exec()
$command = $ffmpegPath . " -i " . $srcFile . " -ar " . $srcAR . " -ab " . $srcAB . " -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $destFile . " | " . $flvtool2Path . " -U stdin " . $destFile;
exec($command);
echo $command;
// Make multiples function
function makeMultipleTwo ($value)
{
$sType = gettype($value/2);
if($sType == "integer")
{
return $value;
} else {
return ($value-1);
}
}
?>
EDIT: This script looks like it's trying to run a unix command with it's pipe symbol and stdin. Could this be intended to run on a unix/linux server instead?
Have you modified this test script at all, and more importantly where did you get it from? -
First off, I want to thank you for taking the time to help me. I appreciate it, very much.
I'm not very savvy when it comes to PHP, JavaScript, etc. but I'm learning. I'm putting together a website that is comprised of several different scripts I've found all over the Web. I've gotten everything to work except for being able to convert/stream user uploaded videos.
The all-in-one script (just like almost all scripts I've found) appears to have been written with NIX based systems in mind. I don't know who authored it. It's the only one that I have not been able to get working. I've posted on several other forums and blogs but I have not received any replies. I've come across very little information for using PHP with ffmpeg/flvtool2 on a Windows/Apache platform.
I'm thinking my ffmpeg/flvtool2 installs could be the problem. I posted in this forum because I was hoping someone on here is using ffmpeg and flvtool2 on Windows.
I tried the script in post #11 but I get the following error even when I change the paths. I've tried forward slashes, backslashes, double back slashes and I've even placed the script in the same folder that contains the video file:
Code:Warning: Can't open movie file C:\www\test\clock.avi in C:\www\test\6.php on line 9 Fatal error: Call to a member function getFrameWidth() on a non-object in C:\www\test\6.php on line 11
Last edited by jeffshead; 19th Oct 2011 at 16:50.
-
I think I need to get some sleep... The last time I tested the script from post #11 I used the wrong path to the video file, everytime.
I tested it again, with the correct path and the commands showed on the page and 'clock.flv' was created but it is 0KB.
Only paths with double back slashes worked.
Now I need to figure out why the file is 0KB. -
It's a bit of a learning process for me too. But I've used Apache, PHP, ffmpeg, so it's not all new.
The all-in-one script (just like almost all scripts I've found) appears to have been written with NIX based systems in mind. I don't know who authored it.
I've come across very little information for using PHP with ffmpeg/flvtool2 on a Windows/Apache platform. I'm thinking my ffmpeg/flvtool2 installs could be the problem. I posted in this forum because I was hoping someone on here is using ffmpeg and flvtool2 on Windows.
Been there, done that
I tested it again, with the correct path and the commands showed on the page and 'clock.flv' was created but it is 0KB.
Now I need to figure out why the file is 0KB.
This is what I'm getting with some dummy data added to the code:
Code:C:\\ffmpeg\\bin\\ffmpeg.exe -i C:\\test\\clock.avi -ar 44100 -ab 128 -f flv -s 640x480 C:\\test\\clock.flv | C:\\flvtool2\\flvtool2.exe -U stdin C:\\test\\clock.flvtool2
Can you copy and paste the command in the browser that produces a file of 0KB?
*On a slightly different topic; You're probably aware of this, but security is an important issue if the code is going to end up on a public website. It really needs to be bulletproof. A business intranet wouldn't be so much of a problem, but you could still have users accidentally doing something wrong and causing grief.
It's one area that I haven't looked at in detail as all my code to date hasn't ended up online.
For example, the all-in-one script on page #1 uses the escapeshellcmd() function to sanitise user input and stop someone easily running commands on the webserver. Things like this need to be done as a matter of course.Last edited by intracube; 20th Oct 2011 at 23:31.
-
This is what shows on the page when I use your version of the script from post #11. It creates the 0KB 'clock.flv' file:
Code:C:\ffmpeg\bin\ffmpeg.exe -i C:\www\test\clock.avi -ar 8000 -ab 8 -f flv -s 320x320 C:\www\test\clock.flv | C:\flvtool2\flvtool2.exe -U stdin C:\www\test\clock.flv
-
I've just been browsing the Flowplayer website, and there might be a much simpler way to do what you're trying to do that works out of the box. Take a look at these links:
http://flowplayer.org/setup/index.html
http://flowplayer.org/setup/howto/
http://flowplayer.org/documentation/index.html
From the site:
Any format goes
Your original video file can be in any format and located on your local hard disk or on a web server. Setup takes care of the file conversion to a web-friendly format. The file is served globally, automatically.
Flowplayer has moved on a lot since I last looked at it...
I'll have a better look at it later to see if it actually does what you want, but thought I'd mention it now so you don't spend any more time with the current method. -
Thanks for the Flowplayer tip but I think it will be more work in the long run because I don't think it gives the same functionality, right out of the box, as does the script I'm trying to use.
I made a little bit more progress. I found another small script I used to test my ffmpeg install. It did successfully convert a couple of test videos.
PHP Code:<?php
convertToFlv( "1.mp4", "test.flv" );
function convertToFlv( $input, $output ) {
echo "Converting $input to $output<br />";
$command = "ffmpeg -i $input -s 320x240 -ar 44100 -r 12 $output";
echo "$command<br />";
shell_exec( $command );
echo "Converted<br />";
}
?>
At least I now know my setup can convert videos. Maybe it's just a matter of finding the correct code to use with a Windows setup. -
While Flowplayer might not do what you want, there might be other ready made solutions that do. Or you could bolt together several solutions.
Can you give a list of the features you eventually want to have? Have you already got other parts of this site up and running?
If I'm understanding what you've said so far, you're essentially looking to create a walled garden version of YouTube/Facebook which would include: login page, user accounts, account management, a way to browse/search for videos, comments system, ability for users to delete their own videos, etc. This would be a huge amount of work to write yourself, even if you stitch together pieces of code from various sources.
It'd be much simpler to modify existing web software to meet your needs. For example, use a free bulletin board system like phpBB, configure it to require an account to access any of the forums, and allow users to add videos to their posts in a similar way to this forum - but the video would be uploaded and converted, rather than just linked to. In addition, Wordpress might give you some other functionality you want.
I've noticed a number of issues with the code in post #11 which I've modified and can post later. What video player were you planning on using? The existing scripts would give you a h263 .flv file. h264 is a preferred format for streaming these days, and the scripts can be modified to produce this but the video player needs to support it (many do). -
Updated test script:
PHP Code:<?php
// test encode script v0.32, 2011-10-20
// Set our source file
$srcFile = "C:\\test\\clock.avi";
$destFile = "C:\\test\\clock.flv";
$ffmpegPath = "C:\\ffmpeg\\bin\\ffmpeg.exe";
$ffmpegPreset = "C:\\ffmpeg\\presets\\libx264-medium.ffpreset";
// Create our FFMPEG-PHP class
$ffmpegObj = new ffmpeg_movie($srcFile);
// Save our needed variables
$srcWidth = makeMultipleTwo($ffmpegObj->getFrameWidth());
$srcHeight = makeMultipleTwo($ffmpegObj->getFrameHeight());
$srcAspect = round($srcWidth / $srcHeight, 2);
$srcFPS = $ffmpegObj->getFrameRate();
// Call our convert using exec()
$command = "$ffmpegPath -i $srcFile -r $srcFPS -ac 2 -ar 44100 -ab 128k -acodec libmp3lame -vcodec libx264 -fpre $ffmpegPreset -crf 24 -s ${srcWidth}x${srcHeight} -aspect $srcAspect $destFile";
exec($command);
echo $command;
// Make multiples function
function makeMultipleTwo ($value)
{
$sType = gettype($value/2);
if($sType == "integer")
{
return $value;
} else {
return ($value-1);
}
}
?>
I've modified quite a few things and stripped out flvtool2 completely. I can't see that it serves a purpose here.
If this doesn't work, try copying the code displayed in the browser and run it directly on the server. Post any errors here.Last edited by intracube; 20th Oct 2011 at 13:51.
-
Does not work from web or directly on server;
Here is error from commandline:
Code:file for preset 'main' not found
Code:[avi @ 003D9F40] parser not found for codec msrle, packets or times may be inval id. [avi @ 003D9F40] parser not found for codec truespeech, packets or times may be invalid. [avi @ 003D9F40] max_analyze_duration 5000000 reached at 5000000
-
You're right about the site being a walled garden version of YouTube/Facebook. Actually, the site is pretty much complete except for being able to upload/stream user videos and changing the look of the site.
The script in post #11 is not part of the all-in-one script. It was something I found and used only to test ffmpeg since I did not know if the issues were caused by my ffmpeg install or the all-in-one script.
I was hoping that the all-in-one script just needed some simple path tweaking. It uploads the videos into the temp folder and renames them but they just sit there. The encode, thumbnail creation and moving of the file never happens. I can't find any mention of a cron job being needed. I really think the issue is with it being made for NIX but I have no clue about what to change and I have found very little information about scripts for ffmpeg on WAMP.
I very rarely consider "throwing in the towel" but this one has really got me stumped
I've attached the script's PHP files if you care to have a look.Last edited by jeffshead; 20th Oct 2011 at 13:47.
-
I was half expecting you to get that error. FFmpeg supports presets where many of the encoding parameters can be defined. Seems that the windows version of FFmpeg still doesn't come bundled with them. Download the attachment in this post, create a 'presets' folder (all lowercase) in C:\ffmpeg\ and place the file in there.
If I try a different file I get these errors including the one above:
EDIT: I'm having trouble uploading the preset as an attachmentI'll ask one of the forum mods.
I've modified the code in post #19 to work with the preset, but hold off doing anything until I can upload this file. -
Still can't upload the file. Instead, copy and paste the text into nodepad and save as libx264-medium.ffpreset in:
C:\ffmpeg\presets\
Code:coder=1 flags=+loop cmp=+chroma partitions=+parti8x8+parti4x4+partp8x8+partb8x8 me_method=hex subq=7 me_range=16 g=250 keyint_min=25 sc_threshold=40 i_qfactor=0.71 b_strategy=1 qcomp=0.6 qmin=10 qmax=51 qdiff=4 bf=3 refs=3 directpred=1 trellis=1 flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip wpredp=2
-
Great. Give it a test with as many varied file formats as you've got; different framerates/aspect ratios/sizes/codecs/etc.
There's obviously a lot of room for refinement with the script. Limiting the resolution is one idea that comes to mind. If a user uploads an HD 1920x1080, the script will spit out a file at that res, so you might want to define a maximum resolution somewhere. -
The last code I used to successfully convert files is in post #23.
After spending day after day searching for answers, I finally gave up on trying to make the original script work work for WAMP. The script was designed to work on LAMP and I could not find anyone that knows why it works on LAMP but not WAMP. This is actually the second time in 2-3 years that I've tried to get this script fully functional on WAMP. The script is fully functional otherwise.
Similar Threads
-
solved = struggling to get ffmpeg-php to compile
By richiedood in forum Video ConversionReplies: 30Last Post: 12th Jul 2011, 20:39 -
php-ffmpeg video conversion
By Tonybot in forum Video ConversionReplies: 6Last Post: 7th Jun 2011, 03:37 -
php-ffmpeg video conversion
By Tonybot in forum ProgrammingReplies: 1Last Post: 6th Jun 2011, 02:36 -
Rip stream video from website
By Browneyd in forum Video Streaming DownloadingReplies: 2Last Post: 7th May 2011, 12:33 -
Stream flash video on website
By alexandros27 in forum Video Streaming DownloadingReplies: 4Last Post: 10th Jul 2010, 13:06