相关文章推荐
才高八斗的路灯  ·  === ...·  1 周前    · 
近视的火龙果  ·  golang ...·  1 年前    · 
深情的小刀  ·  Spring Boot 学习笔记 – ...·  1 年前    · 

不同版本的ffmpeg,avcodec_open2(c,codec,NULL),  返回-22, 原因不同。

avcodec_open2(c, codec, NULL); 返回-22,打开失败。

原因之一:

因为 codec 没有找到编码器

正确(大体)流程:

  1. av_register_all();// 一定要先注册,注册封装格式等信息
  2. avcodec_register_all();// 注册编解码器
  3. avcodec_find_encoder()/avcodec_find_by_name(); //找到编码器。 后面的函数不好使,建议用ID去找编解码器。
  4. avcodec_alloc_context3(); // 初始化编码器上下文
  5. avcodec_open2(); 打开编码器

原因之二:

ffmpeg,2.5.2 版本的,当编解码器上下文,和编解码器的某些格式不一致的时候,就会打开失败。比如下面的参数,就由于sample_fmt 格式设置错误,而无法打开。

正解:应该设置为 AV_SAMPLE_FMT_S16  格式,才可以打开。

原因之三:

ffmpeg, 3.4.1 版本的,当编解码器上下文,和编解码器的某些格式不一致的时候,就会打开失败。比如下面的参数,就由于sample_fmt 格式设置错误,而无法打开。

正解:应该设置为 AV_SAMPLE_FMT_FLTP 格式,才可以打开。

可能是因为版本大的跳跃,计算机的处理能力增强,然后从整型到浮点型,录制音频,品质会更好。

1背景介绍 做了个屏幕录制程序,可自选屏幕区域进行录制,保存格式可选为mp4,使用ffmpeg实现生成mp4格式文件,全屏幕录制无任何 问题 ,自选区域录制部分情况下生成mp4文件无数据 2 问题 描述 当mp4文件无数据时,均是由于使用ffmpeg过程中a vcode c_ open 2函数 失败 造成,如默认1024 768录制,无任何 问题 ,但设置录制区域为1024 767会返回非0值,但两种情况下a vcode c_ open 2函数第一个参数A VCode cContext指针除宽度高度外其余值均相等 3 问题 处理 经过修改宽度 播放器播放视频无声音,通过调试发现a vcode c_ open 2返回-22,导致无法播放声音。 面对海量的代码,感觉无从下手,静下心一想,可以回溯到有声音版本的代码,通过比较代码发现,原来ffmpeg版本经过了改朝换代,更新到最新版本,许多头文件作了修改。 突然灵光一闪,难道是ffmpeg的头文件与库文件的版本不对应?于是将ffmpeg的最新版本的所有头文件替换到项目中,测试通过。 bug 解决 的同时,... * Initialize the A VCode cContext to use the given A VCode c. Prior to using this * function the context has to be allocated with a vcode c_al 由于项目需求,需要开发一个私有播放器,所以就无法使用ffmpeg通用的取流接口:avformat_ open _input()(埋下祸根)其中遇上了一个坑在创建音频解码器的时候返回 失败 ;反复对比视频解码器的创建流程,按理说不应出现 问题 才对。 解决 过程 查阅资料根本原因:主要是由于A VCode cContext中赋值的不匹配,主要设置参数: codec _type、sample_fmt、channel_layout、sample_rate、channels。 最终,经过多方探索终于找到了 问题 所在:对比网上 函数:int a vcode c_ open 2(A VCode cContext *avctx, const A VCode c * codec , AVDictionary **options); 头文件:A vcode c.h 官方解释:  * Initialize the A VCode cContext to use the given A VCode c. Prior to using this //1.使用A VCode c初始化A VCode cContext //2.此方法线程不安全 int a vcode c_ open 2(A VCode cContext *avctx, const A VCode c * codec , AVDictionary **options); 主要做了一下工作: 通过s->internal是否为空来判断 Codec 是否已经 打开 了,不会重复 打开 。 创建A VCode cContext私有的A VCode cInternal,以供内部使用 为A VCode cInternal内部成员变 上一节我们尝试分析了avformat_ open _input函数的源码,这个函数的虽然比较复杂,但是它基本是围绕着创建和初始化一些数据结构来展开的,比如,avformat_ open _input函数会创建和初始化AVFormatContext,AVClass ,AVOption,URLContext,URLProtocol ,AVInputFormat ,AVStream等数据结构,这些数据结构的关系如 可以看到,函数一上来就会检查编码器是否 打开 ,以及传入的A VCode cContext是不是一个编码器,两个条件有一个不成立,就返回。这个错误,a vcode c_send_frame()函数源码为。那我们接下来可看一下什么情况下会报。表示找不到编码器,并抛出错误。可以先验证一下-22是不是。验证成功,返回值-22就是。作为编码函数,作用是将。 最近在搞 Android 硬解码。在 软解码 和 硬解码 的兼容实现上,进行了各种尝试。后来,忽然发现,无法正常解码了,竟然出现 Failed to open codec 。 使用 ret = a vcode c_ open 2(ctx, codec , null ptr) 查看到 返回值为 -1,获取到的错误信息是 “Operation not permitted”。这让我很头疼,对 Android 开发而言,权限这种东西,唉。 但是经过百度,发现,有网友称是因为 timebase.den 和 timebase.n. 使用ffmpeg x264进行编码的时候,a vcode c_ open 报错: [libx264 @ 00021bb0]broken ffmpeg default settings detected [libx264 @ 00021bb0]use an encoding preset (vpre) 解决 方法:在 x264 的source file encoder/encoder.c 中找到该报错的地方 /* Detect default ffmpeg settings and terminate with an h265/hevc编码的视频无法 打开 编解码器 问题 遇到 问题 : 升级或使用1.5.6版本的JavaCV后运行报a vcode c_ open 2() error -1:Could not open video codec 错误。 这是因为1.5.6开始javacv不再默认包含gpl许可协议的编解码库,涉及到的库包含:libx264、libx265等等 如何 解决 : 在原有的基础上添加一个gpl依赖 <dependency> <groupId>org.bytedeco</g   上次说到如果音频帧的声道设置为0时,在推流写帧时会报错(参见JavaCV音频推流报错:org.bytedeco.javacv.FrameRecorder$Exception: No audio output stream (Is audioChannels > 0 and has start() been called?)),实际上,如果声道设置的值 > 2,也会报错: Ex...