Как захватить ввод устройства с ffmpeg в C? - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь использовать ffmpeg в своем коде C для захвата ввода устройства, например, экрана и аудиозаписи. Я просмотрел их официальную документацию и вики, но документация по API не очень хорошо объяснена по сравнению с использованием командной строки.

Согласно документации, если я захочу записать звук с помощью alsa в Linux, я мог бы, например,

ffmpeg -f alsa -i hw:<#card>,<#device> -t <seconds> out.wav

Я хочу использовать C API для того же, понимаете?

1 Ответ

0 голосов
/ 24 мая 2019

Я не уверен, для чего на самом деле предназначена ваша программа, но если особых ограничений нет, вы можете попробовать вызывать команды оболочки на C:

/**
 * @brief exec_shcmd - execute a shell command via popen
 *(This function doesn't support write command now. such as 'echo "abc" > abc.txt')
 *
 * @para cmd_line - shell command string
 * @para read_buf - output string buffer after execute command
 * @para len - length of read buffer
 *
 * @return result of shell command execute
 * @retval 0 - success
 * @retcal -1 - failed
 */
int exec_shcmd(char *cmd_line, char *read_buf, ssize_t len)
{
    FILE *stream;

    if ((cmd_line == NULL) || (read_buf == NULL) || (len == 0)) {
        assert(0);
        return -1;
    }

    stream = popen(cmd_line, "r");
    if (stream == NULL) {
        assert(0);
        return -1;
    }

    memset(read_buf, 0, len);
    fread(read_buf, sizeof(char), len, stream);
    pclose(stream);

    printf("execute a shell command: %s", cmd_line);
    printf("shell command return: %s", read_buf);

    return 0;
}

Это функция, которую я использую,Вы можете изменить его в соответствии с вашими потребностями.И вы можете использовать его так:

void main(void)
{
    char *cmd = "ls -al\n";
    char buf[500];
    int ret;

    printf("<-----------cmd exec------------->\n");

    ret = exec_shcmd(cmd, buf, sizeof(buf));
    printf("result(0 - success -1 - fail): <%d>\n", ret);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...