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()关闭输入输出上下文,释放所有资源。

希望可以帮到大家~

相关文章
|
6月前
|
Web App开发 编解码 安全
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
608 4
|
6月前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
93 0
|
5月前
|
存储
FFmpeg的流程
FFmpeg的流程
|
21天前
FFmpeg中结构释放小函数
本文介绍了FFmpeg中用于释放不同结构体内存的泛化变参模板函数CleanUp,以及如何特化该模板以释放AVFormatContext、AVCodecContext、AVPacket、AVFrame和uint8_t*类型的内存,并提供了一个测试文件来演示这些函数的使用。
17 3
|
5月前
|
Linux 编解码 Python
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
AV1是一种高效免费的视频编码标准,由AOM联盟制定,相比H.265压缩率提升约27%。各大流媒体平台倾向使用AV1。本文介绍了如何在Linux环境下为FFmpeg集成AV1编解码库libaom、libdav1d和libsvtav1。涉及下载源码、配置、编译和安装步骤,包括设置环境变量以启用这三个库。
235 3
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
|
5月前
FFMpeg解复用流程
FFMpeg解复用流程
|
6月前
|
编解码 算法 C++
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
59 0
|
9天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
49 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
16天前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
36 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频