UI界面启动后视频也要叠加上来,视频有3种模式,预览、录像和播放。UI界面要始终存在,但是视频模式可以切换。Qt界面作为父进程始终运行于桌面,调用exec函数族启动视频模式子进程,这个子进程实际是执行“telescope”二进制文件,"telescope"源文件实际上使用main(int argc, char *argv[])接受命令行参数来判断在哪种视频模式下运行。
在qt工程的main.cpp文件中
int main(int argc, char *argv[])
{
.
.
.
char *arg[10] = {"./telescope >> /mnt/sd/kd-log"};
int pid;
pid = fork();
if (pid == -1) {
printf("Could not fork child process.\n");
}
else if (pid == 0) {
execv("./telescope", arg) ;
}
return app.exec();
}
qt中也提供了接口QProcess::startDetached("./telescope>> /mnt/sd/kd-log");也可启动子进程
telescope源文件程序:
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <time.h>
#define RET_NONE
#define RET_OK 0
#define RET_ERROR -1
#define WORK_PATH "/home/root"
#define CMD_PREVIEW "./encode -v 110203-112233.264 -I 1 -y 2 -k -o -f"
#define CMD_RECORD "./encode -v 110203-112233.264 -I 1 -y 2 -k -o"
#define CMD_REPLAY "./decode -v 110203-112233.264 -y 2 -O composite -k -o"
#define MODE_PREVIEW 'p'
#define MODE_RECORD 'r'
#define MODE_REPLAY 'd'
int video_run(char videoModeNew)
{
int pid;
FILE *fp;
time_t t;
static int videoModeCur=0;
int rev=0;
static int i=0;
if((fp=fopen("/mnt/sd/video_dbg.log","a")) < 0) return -2;
t=time(0);
if(MODE_PREVIEW == videoModeNew){
system(CMD_PREVIEW);
fprintf(fp,"%d Preview %s \n", i++,asctime(localtime(&t)) );
}
else if(MODE_RECORD == videoModeNew){
system(CMD_RECORD);
fprintf(fp,"%d Record %s \n \n", i++, asctime(localtime(&t)) );
}
else{
system(CMD_REPLAY);
fprintf(fp,"%d Replay %s \n", i++, asctime(localtime(&t)) );
}
fclose(fp);
return RET_OK;
}
// 2.telescope main()
main(int argc, char *argv[])
{
FILE *fp;
time_t t;
int i=0;
char video_module = 'p';
if(argc == 2 &&
(argv[1][0]=='p' || argv[1][0]=='r' || argv[1][0]=='d'))
{
video_module = argv[1][0];
}
// 2 switch between encode and decode mode
while(1)
{
// 2.1 execute encode/decode mode
video_run(video_module);
// 2.2 execute encode/decode mode
if((fp=fopen("/tmp/run_video_module","r")) != NULL)
{
video_module=fgetc(fp);
printf("sw video_mode: %c\n",video_module);
fclose(fp);
}
else printf("Fail to sw video_mode: %c\n",video_module);
sleep(1);
}
}
在int video_run(char videoModeNew)函数中调用system函数来执行二进制文件,这里需要两个bin文件,encode和decode。encode分为预览和录像模式,录像模式相比预览模式多了一个memory即存入内存的线程,decode是播放模式下的进程。
主函数中的while循环实时读取文件中字符,把读到的字符赋值给video_module作为被调用video_run(char videoModeNew)函数的入参以此来启动不同的进程来切换视频模式。