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

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

解决方法

1. 忘加av_register_all();

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

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

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

希望可以帮到大家~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨笨小乌龟11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值