FFmpeg를 독립 실행형 프로그램 대신 라이브러리로 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/2401764

문제

제가 작성 중인 프로그램에 비디오 변환 기능을 추가하고 싶습니다.이를 수행하기 위한 FFmpeg의 명령줄 인터페이스는 간단합니다. ffmpeg -i InputFile OutputFile, 하지만 라이브러리로 활용하여 다음과 같은 작업을 수행할 수 있는 방법이 있나요? ffmpeg_convert(InputFile, OutputFile)?

나는 libavcodec을 직접 사용할 필요가 없기를 바라고 있습니다. 왜냐하면 형식 간 변환이 한 줄짜리 함수보다 훨씬 더 복잡할 것이라고 생각하기 때문입니다.FFmpeg를 쉽게 개조할 수 없다면 이를 기반으로 하는 다른 라이브러리가 있을까요?libvlc에 대해 들어본 적이 있지만 동영상만 노출하는 것 같습니다. 놀이 비디오 변환이 아닌 API입니다.

감사해요.

도움이 되었습니까?

해결책

당신은 필요합니다 libavcodec 그리고 libavformat. 그만큼 자주하는 질문 당신에게 말한다 :

4.1 FFMPEG 라이브러리, 특히 libavcodec 및 libavformat를 사용하는 방법을 보여주는 예가 있습니까?

예. FFMPEG 문서의 개발자 안내서를 읽으십시오. 또는 이미 FFMPEG at (projects.html).

FFMPEG 문서 안내서는 다음에서 찾을 수 있습니다 ffmpeg.org/documentation.html, 포함하는 개발자 가이드. 나는 보는 것이 좋습니다 libavformat/output-example.c 또는 아마도 ffmpeg 명령 줄 유틸리티 자체.

다른 팁

시스템 호출이 아닌 함수로 ffmpeg를 호출하고 싶다면 꽤 쉽게 할 수 있습니다.

ffmpeg.c에서 다음을 변경합니다.

int main(int argc, char **argv) to int ffmpeg((int argc, char **argv)

그런 다음 ffmpeg 함수를 호출하고 명령줄을 모방하는 배열을 전달합니다.더 쉽게 만들려면 함수를 사용하여 argc, argv 변수를 생성하세요.

static int setargs(char *args, char **argv)
{
    int count = 0;

    while (isspace(*args)) ++args;
    while (*args) {
        if (argv) argv[count] = args;
        while (*args && !isspace(*args)) ++args;
        if (argv && *args) *args++ = '\0';
        while (isspace(*args)) ++args;
        count++;
    }
}

char **parsedargs(char *args, int *argc)
{
    char **argv = NULL;
    int    argn = 0;

    if (args && *args
        && (args = strdup(args))
        && (argn = setargs(args,NULL))
        && (argv = malloc((argn+1) * sizeof(char *)))) {
          *argv++ = args;
          argn = setargs(args,argv);
    }

    if (args && !argv) free(args);

    *argc = argn;
    return argv;
}

void freeparsedargs(char **argv)
{
    if (argv) {
        free(argv[-1]);
        free(argv-1);
    }
}
    return count;
}

int main()
{
    char **argv;
    char *cmd;
    int argc;

    cmd = "ffmpeg -i infile outfile";
    argv = parsedargs(cmd,&argc);
    ffmpeg(argc, argv);
}

예, libavcodec 및 libavformat을 사용해야합니다. FFMPEG 소스 코드 내부의 FFPLAY.C에 대해 읽어야한다고 생각합니다. 해당 파일로 시작하는 것이 더 쉬울 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top