Analise a causa do problema
Muitas vezes encontramos o erro "um arquivo não está definido" ao desenvolver:
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
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:
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.
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
Eu procurei no arquivo avformat.h, e não estava lá:
Acabei de abrir o arquivo avio.h:
pesquisado e com certeza existem funções relacionadas:
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
Endereço:
https://git.ffmpeg.org/gitweb/ffmpeg.git
Selecione diretamente uma versão de 4.1.x para inserir o commit
Aqui você pode ver o id do commit do commit:
commit 4521700f295f35da4768f88b570e0836a858ce7b
tree 53e22f7d49cc946c635373d32abfa556961067ed
parent 2f54cd9548e2a8fe0ecba9a345b66f0798dd243e
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:
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;
}
~