我个人出现这个错误的时候是在打开文件时报的错误,开始以为我需要加上资源文件,那样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()
关闭输入输出上下文,释放所有资源。
希望可以帮到大家~