How to stop ffmpeg remotely?
Newer versions of ffmpeg don't use 'q' anymore, at least on Ubuntu Oneiric, instead they say to press Ctrl+C to stop them. So with a newer version you can simply use 'killall -INT' to send them SIGINT instead of SIGTERM, and they should exit cleanly.
How to programmatically start/stop FFMPEG stream transcoding
So I was doing a combination of things wrong.
For starters, I needed to push the output form ffmpeg to a log file and also tell it to overwrite my temp file without prompting using the -y argument.
So instead of
ffmpeg -f mjpeg -i "http://user:pass@10.0.1.200/nphMotionJpeg?Resolution=640x480&Quality=Standard" -b:v 1500k -vcodec libx264 /tmp/test.mp4
I am now using
ffmpeg -y -f mjpeg -i "http://user:pass@10.0.1.200/nphMotionJpeg?Resolution=640x480&Quality=Standard" -b:v 1500k -vcodec libx264 /tmp/test.mp4 </dev/null >/dev/null 2>/tmp/ffmpeg.log &
The second problem was that I wasn't waiting long enough before sending the kill command to ffmpeg, and so a corrupt file was being created.
By adding the -t (for time limit) argument with 1 second, I determined that it takes an average of 15 seconds for ffmpeg to record 1 second of video. Increasing the time limit to 10 seconds made the average increase to 25 seconds, so it seems that on my server at least, theres 14 seconds of overhead. By increasing my sleep command in my php script to 30 seconds, I was able to get a useable video file.
So having PHP kill the ffmpeg process results in an unknown (or approximate at best) recording time length which is completely dependent on CPU power, network bandwidth, etc.
Thats a bit of a bummer because I had hoped to be able to increase the recording length depending on some external variables (I have insteon motion sensors feeding a database, i would like to record until the motion stops).
In any event, here is a working PHP script in case it helps someone in the future:
<?php
print date('H:i:s')."\nStarted recording. waiting 60 seconds...\n";
exec('../lib/ffmpeg -y -f mjpeg -i "http://user:pass@10.0.1.200/nphMotionJpeg?Resolution=640x480&Quality=Standard" -b:v 1500k -vcodec libx264 /tmp/test.mp4 </dev/null >/dev/null 2>/tmp/ffmpeg.log &');
sleep(60); // Wait long enough before killing, otherwise the video will be corrupt!
shell_exec('pkill ffmpeg'); // find and kill
echo "done\n\n";
exit();
?>
Related Topics
Is It Ok (Performance-Wise) to Have Hundreds or Thousands of Files in the Same Linux Directory
Open a File Directly from a Gitlab Private Repository
How to Read Only First N Bytes from the Http Server Using Linux Command
Linux: Run Cron Job in Foreground
Elasticsearch Process Memory Locking Failed
Linux - Without Hardware Soundcard, Capture Audio Playback, and Record It to File
Node.Js Child Processes Being Killed When Parent Dies
What's the Point of Using Busybox in a Low Ram Embedded System
Clear a Terminal Screen For Real
How Does Copy_From_User from the Linux Kernel Work Internally
Using Objdump for Arm Architecture: Disassembling to Arm
How to Check Hz in the Terminal
Can Gdb Change the Assembly Code of a Running Program
Solution for Git Gui Client for Remote Ssh
Linux - Watch a Directory for New Files, Then Run a Script
Nasm - Symbol 'Printf' Causes Overflow in R_X86_64_Pc32 Relocation