I wanted to be able to stop and start the camera driven by events instead of just calling raspivid to record for a preset time.
My code is really just a simple wrapper around raspivid using the SIGUSR1 option to stop the video under program control rather than after a preset time.
The example main() function starts the video, sleeps for five seconds and then stops it. For demo purposes I included the options for black and white inverted video. To record with the normal raspivid defaults you just call startVideo with an empty options string:
startVideo(“filename.h264”, “”);
Obviously you can put any of the normal raspivid options in the string – but you should avoid -t, -n, -o, and -s as the code fills those in for you. If you want to enable preview/monitoring then make the obvious change to remove the -n (no preview) option.
Save code as, say, video.c and compile with gcc -o video video.c
#include <signal.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> static pid_t pid = 0; void startVideo(char *filename, char *options) { if ((pid = fork()) == 0) { char **cmd; // count tokens in options string int count = 0; char *copy; copy = strdup(options); if (strtok(copy, " \t") != NULL) { count = 1; while (strtok(NULL, " \t") != NULL) count++; } cmd = malloc((count + 8) * sizeof(char **)); free(copy); // if any tokens in options, // copy them to cmd starting at positon[1] if (count) { int i; copy = strdup(options); cmd[1] = strtok(copy, " \t"); for (i = 2; i <= count; i++) cmd[i] = strtok(NULL, " \t"); } // add default options cmd[0] = "raspivid"; // executable name cmd[count + 1] = "-n"; // no preview cmd[count + 2] = "-t"; // default time (overridden by -s) // but needed for clean exit cmd[count + 3] = "10"; // 10 millisecond (minimum) time for -t cmd[count + 4] = "-s"; // enable USR1 signal to stop recording cmd[count + 5] = "-o"; // output file specifer cmd[count + 6] = filename; cmd[count + 7] = (char *)0; // terminator execv("/usr/bin/raspivid", cmd); } } void stopVideo(void) { if (pid) { kill(pid, 10); // seems to stop with two signals separated // by 1 second if started with -t 10 parameter sleep(1); kill(pid, 10); } } int main(int argc, char **argv) { printf("Recording video for 5 secs..."); // example options give an upside-down black and white video startVideo("temp.h264", "-cfx 128:128 -rot 180"); fflush(stdout); sleep(5); stopVideo(); printf("\nVideo stopped - exiting in 2 secs.\n"); sleep(2); return 0; }
Leave a Reply