ffmpeg-avio实战:打开本地文件或者网络直播流dome

使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客

cpp 复制代码
#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".

这是代码的实现,我们来执行一下,配合其他工具看看打开的视频流消息是不是对的。

两路流是正确的。

相关推荐
VidDown1 天前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
可乐鸡翅yeah_2 天前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
开开心心就好3 天前
本地文件搜索工具推荐,占用小速度还快
智能手机·ffmpeg·ocr·word·音视频·网络攻击模型·安全架构
我科绝伦(Huanhuan Zhou)3 天前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
RS迷途小书童3 天前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
开开心心就好3 天前
视频压缩工具推荐,画质效果很能打
智能手机·ffmpeg·ocr·word·排序算法·音视频·散列表
可乐鸡翅yeah_4 天前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
redfred4 天前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
Arcai10244 天前
PostgreSQL数据备份和恢复完全指南
数据库·postgresql·ffmpeg·备份一体机·备份软件·smartstor·智备科技
可乐鸡翅yeah_5 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8