【问题标题】:Terminating a c function终止 c 函数
【发布时间】:2014-03-16 22:03:19
【问题描述】:

我想在 c 中创建一个函数,它将在 Linux 下捕获视频。我通过system() 在捕获视频的c 程序中嵌入了ffmpeg 命令。 ffmpeg 按 [q] 结束。如何在我的 c 程序中包含终止。

此函数是 server.c 程序的一部分。当客户端请求终止时,我希望终止视频功能。这可能吗?

#include<stdio.h>
#include <string.h>


main()
{

char command[180];

sprintf(command, "ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video0 out.avi");
system(command);

}

【问题讨论】:

  • 系统是同步的,直到你的子进程没有完成它才会退出。也许不知何故来自另一个线程,实际上我什至不确定这是否可能。也许只是不使用系统,使用fork(),execv(),然后在你决定停止子进程时杀死
  • @FiddlingBits:它不会,因为 OP 正在使用现成的 ffmpeg,因此无法让它捕捉任何信号以表现特殊。 OP 应该按照 Dabo 在他的评论中提出的fork()-、exec*()-、kill()-child 路径或使用ffmpegs C 接口直接实现必要的功能。如果采用后一种方式,则在另一方面实现信号处理可能是必要且有帮助的。
  • @alk 可以提供示例代码吗?
  • 这不会是一个三班轮。所以对于fork()exec*(),这可能是一个介绍:stackoverflow.com/q/1653340/694576 对于信号处理,此站点上有各种答案,您也可以在他的评论中获得 Fiddling Bits 提供的链接。对于如何使用ffmpeg 的C 接口,您可能想在这里挖掘:ffmpeg.org 一个起点是查看ffmpeg 本身的来源。

标签: c ffmpeg system-calls terminate


【解决方案1】:

当您向示例询问 fork、exec、kill 时,这里是可能的解决方案。 avconv 是我电脑上 ffmpeg 的替代品。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <assert.h>
#include <unistd.h>
#include <sched.h>
#include <sys/wait.h>

pid_t parent_pid;

void sigquit_handler (int sig)
{
    assert(sig == SIGKILL);
    pid_t self = getpid();
    if (parent_pid != self)
    {
        printf("recording done");
        _exit(0);
    }
}

int main()
{
    int pid = 0;
    int status;
    pid_t child;

    signal(SIGKILL, sigquit_handler);
    parent_pid = getpid();

    pid = fork();

    if ( pid == 0)
    {
        execl("/usr/bin/avconv","avconv","-f","video4linux2","-r","25","-s","640x480","-i","/dev/video0","out.avi",(char*)0);
    }
    else if( pid > 0)
    {
        sleep(5);
        kill(pid, SIGKILL);

        child = wait(&status);
        printf("child %d succesully quit\n", (int)child);
    }
    return 0;
}

【讨论】:

  • 我试过了:execl("/home/root/ffmpeg","ffmpeg","-f","v4l2","-r","25","-s","640x480","-i","/dev/video0","out.avi",(char*)0);,但代码跳过了这个命令。你知道我错过了什么吗?提前致谢。
  • /home/root 看起来不像 ffmpeg 命令的位置。它应该类似于我的示例。
  • /home/root 是安装后 ffmpeg 文件夹所在的位置。除了 /home/root 之外,其他任何地方都没有 ffmpeg。但是,我可以从任何目录运行命令 ffmpeg 本身。
  • 将 ffmpeg 文件夹复制到/usr/bin 目录后问题解决。感谢您的帮助。
猜你喜欢
  • 2017-09-17
  • 2018-05-23
  • 1970-01-01
  • 2017-12-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多