FFmpeg学习笔记-踩坑

来源:互联网 发布:巫师3上古卷轴5 知乎 编辑:程序博客网 时间:2024/05/21 01:54

意外的endif:

 /*后应该输入空格再输入注释:/* comment */


 yuv文件失败:

可能是yuv文件已经打开了


错误C1010:

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?


无法解析的外部符号被引用的原因:

1、头文件中的函数声明忘记加在extern C内
2、忘记动态链接dll


为什么加extern?
答:在链接的时候,全局变量的作用域从本文件扩展到整个程序,但在编译的时候,各个文件的全局变量的可见性仅限于本文件,所以通过extern声明告诉编译器该全局变量在别的文件中定义了,本文件可以放心使用。


读取字符串中的字符出错(无法读取内存):
1、该处代码未执行(变量未初始化,赋值)
2、未正确分配内存
3、越界访问


--不能将文件的rawdata直接写入到AVFifoBuffer,文件中的数据必须先写入内存中,再从内存(malloc过的buffer)写入到AVFifoBuffer.

--释放了结构体(SwsContext)之后,一定不能继续使用该结构体的指针(SwsContext*),会造成未知错误。正确的做法是让指针为空(swsCtx = NULL)。一般的释放函数释放结构体后,结构体指针并没有指为空。


-----------------------------------------------------------

锁没有解锁的话,再次锁就出错:

pthread_mutex_lock(&vp->mutex_t);
if (vp->is_stop)
break;
pthread_mutex_unlock(&vp->mutex_t);

pthread_mutex_lock(&vp->mutex_t);
----------------------------------------------------------


--头文件的包含也是讲究顺序的。
1.例如:add_pics.h结构体声明的fifobuf变量是AVFifoBuf类型,如果未包含声明该AVFoifoBuf的头文件fifo.h的话,就无法判断fifobuf的类型。
2,fifo.h中包含avutil.h,avutil.h中包含common.h,common.h中定义了错误:如果定义了extern C,未定义D__STDC_CONSTANT_MACROS并且未定__STDC_CONSTANT_MACROS,那么就报错


--低级错误:if(ret = 0)


--局部静态变量:只初始化一次,生命周期从定义到main函数结束


--wmv,flv不支持b帧


--提高代码质量的根本出路在于重构,先把功能实现,然后随着代码量的提升,慢慢在思考代码的重构方向.


--变量记得要初始化,要不然运行时编译器默认初始化的值可能会造成访问冲突(保护期?,越界访问?)


--了解debug和release的不同,debug状态下更好调试,debug在调用堆栈的时候提示的层数更多


--fopen文件没有判断FP指针是否为空。。,所以不能确定是否打开了文件


0x00000000 处(位于 test_video_base.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突。
解:导入动态库失败,指针为空(一般是写错了)


变量记得要初始化,不然可能会出现:编译器默认将未初始化的指针初始化为0xcc,而0xcc是被保护的数据区,因此程序崩溃


log不能在循环(while 1)里用,可能异常


找不到头文件可能是解决方案配置(Debug,Release)错了或者是解决方案平台(Win32,X86)错了


malloc(sizeof(300)) //低级错误


一开始结构体ssc和ssc->session_parm都在malloc后都分配了正确的堆内存
然后free(ssc->session_parm)和free(ssc)后告诉编译器这块内存不在需要,请回收。
ssc->volume //0Xdddddddd(未初始化)
strcat(ssc->session_parm, voice_name); //访问堆内存错误,没有malloc过,编译器不给用


const char *sample_rate; //采样率
if (sample_rate == "") { //不能用指针与字符串比较
ssc->sample_rate = "16000";
}
改:if(!strcmp(sample_rate, ""));


bmp要先转为rgb再转yuv
将图片直接解码写入文件(yuv)就会出现错误:Expression:buffer!=nullptr (fwrite.cpp,Line:60)


导出的头文件(A.h)不要包含其它任何头文件(B\C.h)或者是库(D.lib)
内部调用的东西放在源文件中,所以要将包含的头文件和库放在源文件中
中文注释要使用/* comment */ 记得前后空一个空格,不然可能出现未定义标识符,所以还是要改用英文注释
pthread_t要放在结构体里,然后作为导出的结构体的void*成员
记得extern "C"


没有av_register_all,avformat_open_input会出错-1094995529

形参是AVPacket只是拷贝对象,修改的是临时对象的值,而AVPacket*才能改变形参的值
一般定义AVPacket,传参&AVPacket


Error Code : AVERROR_INVALIDDATA = -1094995529


LoadLibrary Failed: 函数声明和函数定义不一致,可能是类型或参数写错(编译器当作重载了)

文件(a.cpp)改过后未重新生成,会出现:让选定路径来打开a.cpp, 所以调试前一定要记得重新编译


avformat_open_input(&avm->i_fmt_ctx_v, in_video, NULL, NULL)) < 0, 出现moov atom not found
原因是encode线程未结束就mux了

原创粉丝点击