Resolva o problema de que a nova versão do ffmpeg não consegue encontrar a função avpriv_io_delete

Analise a causa do problema

Muitas vezes encontramos o erro "um arquivo não está definido" ao desenvolver:
insira a descrição da imagem aqui

Como mostrado na figura acima, quando eu estava aprendendo o desenvolvimento do ffmpeg, segui o vídeo passo a passo. O vídeo do professor era muito suave, mas o código que eu operava sozinho não podia ser compilado de qualquer maneira. O erro é como mostrado acima.

Deixe-me falar sobre as etapas de instalação do meu ffmpeg;
1. Abra http://ffmpeg.org/download.html

2. Copie diretamente o endereço do código git clonado na página inicial de download do site oficial e, em seguida, compile e instale-o

insira a descrição da imagem aqui

Todas as operações de linha de comando não são problema.

Ao usar a linguagem C para desenvolver ffmpeg para manipular arquivos, há um problema.

O código original é o seguinte:

zh@zh-lpc:~/project/ffmpeg$ cat ff.c
#include <stdio.h>
#include <libavutil/log.h>
//#include <libavformat/avio.h>
#include <libavformat/avformat.h>


int main()
{
    
    

        char *fileName="./test.txt";

        int ret;
        ret=avpriv_io_delete(fileName);

        if(ret < 0)
        {
    
    
                av_log(NULL,AV_LOG_ERROR,"Fail to delete file %s \n",fileName);
                return -1;
        }

        return 0;
}
zh@zh-lpc:~/project/ffmpeg$

Encontrado ao compilar:
insira a descrição da imagem aqui

Basta olhar no diretório de instalação do ffmpeg para ver se existe um arquivo contendo esta função:

Como resultado, nem

zh@zh-lpc:~/project/ffmpeg$ grep -nr "avpriv_io_delete" /usr/local/ffmpeg
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ cat /usr/local/ffmpeg/include/libavformat/avformat.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project/ffmpeg$

Vendo que o internauta disse que a função "avpriv_io_delete" está no arquivo avio.h, pesquisei e o resultado ainda é não:

zh@zh-lpc:~/project/ffmpeg$ cat /usr/local/ffmpeg/include/libavformat/avio.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project/ffmpeg$

很无奈,就猜想是自己编译的代码肯定存在问题的。

想着ffmpeg这么正规,肯定有很详细的api文档,或者其他文档说明。
Basta pesquisar no site oficial.

insira a descrição da imagem aqui

Com certeza, eu vi a coluna Documentação da API.

Você pode visualizar a API da versão que deseja visualizar.

Eu verifiquei a versão 4.1:
http://ffmpeg.org/doxygen/4.1/index.html

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Eu procurei no arquivo avformat.h, e não estava lá:
insira a descrição da imagem aqui

Acabei de abrir o arquivo avio.h:
insira a descrição da imagem aqui
pesquisado e com certeza existem funções relacionadas:
insira a descrição da imagem aqui

Solução

Como essa função existe na versão 4.1, só preciso baixar novamente o código da versão 4.1, recompilá-lo e instalá-lo.

这样还是挺麻烦的,因为是git,可以利用切换分支来解决版本的问题。

Se você quiser mudar de branch, primeiro você precisa descobrir qual é o id da versão 4.1.

Abra a interface de download no site oficial novamente e entre na interface de navegação no git
insira a descrição da imagem aqui

Endereço:
https://git.ffmpeg.org/gitweb/ffmpeg.git

Selecione diretamente uma versão de 4.1.x para inserir o commit
insira a descrição da imagem aqui

Aqui você pode ver o id do commit do commit:

commit	4521700f295f35da4768f88b570e0836a858ce7b
tree	53e22f7d49cc946c635373d32abfa556961067ed
parent	2f54cd9548e2a8fe0ecba9a345b66f0798dd243e

insira a descrição da imagem aqui

Em seguida, insira seu próprio diretório de armazenamento ffmpeg e use o seguinte comando para alternar entre as ramificações:

git switch -c 2f54cd9548e2a8fe0ecba9a345b66f0798dd243e

Após a troca, você pode usar o git log para verificar se a troca foi bem-sucedida e onde está atualmente:
insira a descrição da imagem aqui

Depois é só recompilar e instalar.

Você pode consultar o que foi escrito antes:
https://truedei.blog.csdn.net/article/details/120188699

verificar

Pode-se ver que agora existe

zh@zh-lpc:~/project$ cat /usr/local/ffmpeg/include/libavformat/avformat.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project$
zh@zh-lpc:~/project$
zh@zh-lpc:~/project$ cat /usr/local/ffmpeg/include/libavformat/avio.h |grep "avpriv_io_delete"
int avpriv_io_delete(const char *url);
zh@zh-lpc:~/project$

A recompilação e a execução também foram bem-sucedidas:

zh@zh-lpc:~/project/ffmpeg$ gcc -g ff.c -o ff -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavutil
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff  ff.c  ffmpeg_file.c  hello  helloword.c
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ touch test.txt
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff  ff.c  ffmpeg_file.c  hello  helloword.c  test.txt
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ./ff
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff  ff.c  ffmpeg_file.c  hello  helloword.c
zh@zh-lpc:~/project/ffmpeg$

Após testá-lo, é possível escrever "libavformat/avio.h" e "libavformat/avformat.h" no arquivo de cabeçalho:

Porque o arquivo de cabeçalho avio.h está incluído no avformat.h.

#include <stdio.h>
#include <libavutil/log.h>
//#include <libavformat/avio.h>
#include <libavformat/avformat.h>


int main()
{
    
    

        char *fileName="./test.txt";

        int ret;
        ret=avpriv_io_delete(fileName);

        if(ret < 0)
        {
    
    
                av_log(NULL,AV_LOG_ERROR,"Fail to delete file %s \n",fileName);
                return -1;
        }

        return 0;
}
~

Acho que você gosta

Origin blog.csdn.net/qq_17623363/article/details/120235481
Recomendado
Clasificación