作者:少年放肆的温存 | 来源:互联网 | 2023-07-01 16:41
Windows10下开发,ffmpeg3.4
问题一:
- pCodecOut_Audio = avcodec_find_encoder_by_name("libfdk_aac");//什么也没有,打不开
- pCodecOut_Audio = avcodec_find_encoder(AV_CODEC_ID_AAC); //可以打开
原因:ffmpeg3.4 版本中,AAC编码器打不开,需要额外的lib_aac库加入进去。所以后来直接用mp2编码音频。mp2编码的音频,用win10自带的播放器,不能播放声音。换QQ播放器、vlc都可以。
问题二:
avcodec_open2(pCodecCtxOut_Audio, pCodecOut_Audio, 0);// 返回-22
win10系统下,下面这个参数设置为S16,导致avcodec_open2()不能打开,返回-22
改为FLTP,avcodec_open2() 打开成功。
pCodecCtxOut_Audio->sample_fmt = AV_SAMPLE_FMT_FLTP; //AV_SAMPLE_FMT_S16;
问题三:
avio_open(&pFormatCtx_Out->pb, outFileName, AVIO_FLAG_WRITE); //可以打开
avformat_write_header(pFormatCtx_Out, NULL); //返回-22
原因:缺少参数。
问题重现: pFormatCtx_Out, pCodecOut_Audio 这两个参数设置好了,但是流里面的codec没有sample_rate的数据。导致了pFormatCtx_Out,参数不够,打开失败。添加了红色两行之后,就通过了。
问题四:
输入流信息已经获取,现在要赋值输入流的解码器,绿框赋值之后,可以avcodec_open2() ; 成功。
如果不用绿框,直接红框这种方式,则avcodec_open2() 不成功。
如果,有输入帧且需要编码的话,采用红框这种方式,初始化编码器,然后为pCodecCtx_Audio_in赋值各种参数,才能使用。
所以,我的程序的正解,就是采用绿框,注释掉红框。然后问题5也解决了。
问题五:
av_read_frame() 成功,但是avcodec_decode_audio4()失败。究其原因,是第一个参数即解码器的参数不对。
改用直接用流的codec 就通过了
问题六:
av_audio_fifo_write(fifo_audio, (void **)audioFrame->data, audioFrame->nb_samples);// 运行的时候,崩溃
原因是:fifo_audio的格式sample_fmt 与 audio_Frame的格式不相同。
空指针。是因为上面生成的fifo_audio格式与audioFrame->data的格式不匹配,找不到地址。
问题七:
未见处理的异常:0xC0000005:读取位置0xfeeeff22时发生访问冲突
释放指针出的问题。在哪里定义,就在哪里释放。注意释放顺序。读取的数据,结果指针已经被释放了。
问题八:
可能是MFC多线程句柄释放的问题
问题九:
0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
原因:说明指针所指向的空间已经被释放。
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
问题十:
音频的重采样。
如果采样的音频各种格式和要输出的采样的各种格式不同,那么就需要重采样,否则无法输出。
比如:pcm_s16 重采样为 AAC,先记录下重采样的学习地址,稍后再整理。
http://codepad.org/qoknuYAB
https://www.jianshu.com/p/314a929f99fc
https://www.jianshu.com/p/bf5e54f553a4
https://blog.csdn.net/hiwubihe/article/details/81259134
问题十一:
录制MP4成功,但是播放的时候,画面有问题,花屏,模糊。
是因为视频码率设置出了问题。参数设置的不对。后来,直接把ffmpeg-dev版中的sample----encode_video的参数拿来用,解决问题。还是因为基础不够扎实,不知道如何根据屏幕大小自动设置码率。整理基础知识。
问题十二:
avformat_open_input(); 返回-2. 里面的参数,初始化也失败。
错误原始: 没有添加初始化:av_register_all(); // 添加之后,正常打开。
avformat_open_input(); 返回-22. 提示无效参数。
是因为有如下设置:将前两行用最后一行替换,就可以了。
//const char * screen_size = "352x288";
//av_dict_set(&options,"video_size", screen_size, 0);
av_dict_set(&options,"video_size", "352x288", 0);
问题十三:
ret = avcodec_open2(pCodecCtx, pCodec, NULL);
返回 ret = -542398533
是因为,录屏的时候,不小心,把屏幕参数,设置成了"352x255"。所以pCodecCtx->height就变成了奇数,然后就报错了。好像屏幕的尺寸,不可以有奇数。 将尺寸改为 "352x288"这个是正确的参数,就可以正常打开了。
问题十四:
EnterCricalSection(); // 这里总是报错
CapScreen_MFC_2.exe 中的 0x77883cb3 处有未经处理的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
原因是:没有对VideoSection初始化
在主函数中,添加:
InitializeCriticalSection(&VideoSection); // 使用临界区对象之前,必须初始化 临界区对象
问题十五:
有三个线程,但是只运行了1个线程。原因是:名字写错了。手误害si人。
应该是写成:trhead1, thread2, thread3. 因为写错,导致只运行了thread1.