使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libavutil/file.h>
#include <libavutil/dict.h>
#include <stdio.h>
#include <libavutil/error.h>
int main()
{
const char* url = "/home/yth/ffmpeg_text/videos/elon.mp4";
int err = -1;
//1.
av_register_all();
avformat_network_init(); //初始化网络相关的功能,用于处理网络的流媒体
printf("hello ffmpeg\n");
AVFormatContext* pFormatCtx = NULL; //用于存储媒体文件或流的信息
AVInputFormat* piFmt = NULL; //指向输入格式的指针,用于指定打开文件时的格式
printf("helloc, avformat_alloc_context\n");
if((pFormatCtx = avformat_alloc_context()) == NULL) //为pFormatCtx分配内存
{
printf("fail avformat_alloc_context()\n");
goto avformat_alloc_context_err;
}
pFormatCtx->probesize = 5000000;
pFormatCtx->max_analyze_duration = 5000000;
//2.
printf("打开媒体流\n");
//打开本地文件或网络流直播流
//替换为实际的rtsp地址 或在文件路径
//rtsp地址: rtsp://127.0.0.1:8554/rtsp1
//本地文件: ./ymx.mp4
err = avformat_open_input(&pFormatCtx, url, NULL, NULL);
if(err < 0)
{
char errbuf[AV_ERROR_MAX_STRING_SIZE];
av_strerror(err, errbuf, sizeof(errbuf));
fprintf(stderr,"fail avformat_open_input:%s\n",errbuf );
goto avformat_open_input_err;
}
else
{
printf("open stream success\n"); //成功打开
}
//3.
err = avformat_find_stream_info(pFormatCtx, NULL); //获取流的信息,填充pFormatCtx
if(err < 0 )
{
printf("fail avformat_find_stream_info\n");
goto avformat_find_stream_info_err;
}
else
{
printf("open stream success\n"); //获取流信息成功
printf("有n路流 = %d\n", pFormatCtx->nb_streams);
}
avformat_find_stream_info_err:
avformat_close_input(&pFormatCtx); //关闭输入文件或流
avformat_open_input_err:
avformat_network_deinit(); //取消网络流库的初始化
avformat_alloc_context_err:
return err;
}
如果是本地文件没有使用 av_register_all(); 打开媒体文件失败,打印失败原因。比如,如果上面没有调用函数av_register_all,则会打印“XXX failed!:Invaliddata found when processing input”.
这是代码的实现,我们来执行一下,配合其他工具看看打开的视频流消息是不是对的。
两路流是正确的。