不同版本的ffmpeg,avcodec_open2(c,codec,NULL), 返回-22, 原因不同。
avcodec_open2(c, codec, NULL); 返回-22,打开失败。
原因之一:
因为 codec 没有找到编码器
正确(大体)流程:
-
av_register_all();// 一定要先注册,注册封装格式等信息
-
avcodec_register_all();// 注册编解码器
-
avcodec_find_encoder()/avcodec_find_by_name(); //找到编码器。 后面的函数不好使,建议用ID去找编解码器。
-
avcodec_alloc_context3(); // 初始化编码器上下文
-
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...