FFmpeg avformat_open_input() 函数返回错误protocol not found解决方法(实测有效!附简单FFMPEG的编解码流程)

简介: 我个人出现这个错误的时候是在打开文件时报的错误,开始以为我需要加上资源文件,那样QT确实能检测到文件的存在,但是在Debug中他是检测不到这个文件的。

我个人出现这个错误的时候是在打开文件时报的错误,开始以为我需要加上资源文件,那样QT确实能检测到文件的存在,但是在Debug中他是检测不到这个文件的。

解决方法

1. 忘加av_register_all();

2.在./configure时在后面加上 --enable-protocols

3.把视频文件放在你的Debug构建目录中,如果是Relese就放在Relese的构建目录中

image.gif 编辑

FFmpeg的简单编解码流程:

FFmpeg是一个开源的多媒体处理工具包,广泛应用于音视频的编解码、转码、流处理等多种场景。其编解码流程大致可以分为以下几个步骤:

1. 初始化与注册

  • 初始化FFmpeg:使用av_register_all()函数注册所有的编解码器、解复用器、复用器等组件。虽然在FFmpeg 3.0之后这个函数被标记为过时,但对简单应用来说仍可使用。推荐使用更精细的组件注册方法,如针对特定容器格式或编解码器。
  • 创建上下文:根据任务的不同,可能需要创建AVFormatContext(用于处理媒体容器)、AVCodecContext(用于编解码操作)等上下文结构。

2. 打开输入输出

  • 打开输入文件:使用avformat_open_input()函数打开输入文件,然后通过avformat_find_stream_info()获取输入文件的详细信息,包括流的数量、类型等。
  • 寻找流和编解码器:遍历输入文件中的流,使用avcodec_find_decoder()根据流的编解码器ID找到对应的解码器。如果是编码流程,则寻找编码器。
  • 创建编解码上下文:为每个需要处理的流创建一个AVCodecContext,并使用avcodec_open2()打开编解码器。

3. 解复用(Demuxing)

  • 读取数据包:通过av_read_frame()从输入文件中读取AVPacket,这些数据包可能包含视频帧、音频帧或其它数据。
  • 分配帧:为每个解码器创建AVFrame,用于存储解码后的原始数据。
  • 发送数据包到解码器:使用avcodec_send_packet()将AVPacket送入解码器进行解码。

4. 解码(Decoding)

  • 接收解码帧:调用avcodec_receive_frame()从解码器接收已解码的AVFrame。这一步可能需要循环调用,直到所有数据包被处理完或返回特定错误码指示没有更多帧。

5. (可选)处理解码后的数据

  • 缩放、滤镜、转码:根据需要,可以在这一步对解码后的数据进行处理,如图像缩放、添加滤镜效果或进行再次编码(转码)。

6. (编码流程)编码(Encoding)

  • 如果是编码流程,解码后的数据或原始数据将被送入编码器,通过类似的过程进行编码,最终生成编码后的AVPacket。

7. 复用(Muxing)

  • 创建输出上下文:使用avformat_alloc_output_context2()创建输出上下文,根据输出格式和文件名确定。
  • 添加流:为输出上下文添加流,使用avformat_new_stream(),并将编解码上下文关联到流上。
  • 写入头部信息:调用avformat_write_header()写入输出文件的头部信息。
  • 封装AVPacket:将编码后的AVPacket通过av_interleaved_write_frame()av_write_frame()写入输出文件。

8. 清理

  • 关闭上下文:完成所有操作后,使用avcodec_close()关闭编解码上下文,avformat_close_input()avformat_close_output()关闭输入输出上下文,释放所有资源。

希望可以帮到大家~

相关文章
|
5月前
|
Web App开发 编解码 安全
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
526 4
|
5月前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
79 0
|
4月前
|
存储
FFmpeg的流程
FFmpeg的流程
|
4月前
|
Linux 编解码 Python
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
AV1是一种高效免费的视频编码标准,由AOM联盟制定,相比H.265压缩率提升约27%。各大流媒体平台倾向使用AV1。本文介绍了如何在Linux环境下为FFmpeg集成AV1编解码库libaom、libdav1d和libsvtav1。涉及下载源码、配置、编译和安装步骤,包括设置环境变量以启用这三个库。
184 3
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
|
4月前
【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
76 1
|
4月前
FFMpeg解复用流程
FFMpeg解复用流程
|
5月前
|
编解码 算法 C++
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
55 0
|
5月前
|
存储 编解码 缓存
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
224 0
|
13天前
|
XML Java Android开发
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一款国产移动端视频播放器,支持弹幕、滤镜、广告等功能,采用IJKPlayer、Media3(EXOPlayer)、MediaPlayer及AliPlayer多种内核。截至2024年8月,其GitHub星标数达2万。集成时需使用新版Android Studio,并按特定步骤配置依赖与权限。提供了NormalGSYVideoPlayer、GSYADVideoPlayer及ListGSYVideoPlayer三种控件,支持HLS、RTMP等多种直播链接。
49 18
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
|
11天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
EasyPusher是一款国产RTSP直播录制推流客户端工具,支持Windows、Linux、Android及iOS等系统。尽管其GitHub仓库(安卓版:https://github.com/EasyDarwin/EasyPusher-Android)已多年未更新,但通过一系列改造,如升级SDK版本、迁移到AndroidX、指定本地NDK版本及更新Gradle版本等,仍可在最新Android Studio上运行。以下是针对Android Studio Dolphin版本的具体改造步骤。
38 3
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
下一篇
无影云桌面