ffmpeg 音频视频 使用过程中碰到的问题记录

1 音频packet解码为frame之后,音频数据的大小:

        pframe->data[0],为数据地址,数据的大小应该使用函数av_samples_get_buffer_size( NULL, av_frame_get_channels( pFrame ), pFrame->nb_samples, ( AVSampleFormat )pFrame->format, 1 ); 来获取,如果使用pFrame->linesize[0]作为大小,音频数据会有杂音(为了性能考虑,字节对齐,这个值可能比实际数据大小要大一点)。

 

2 opensles 播放器请求数据的时候如果给了null,给了几次null之后它就不会来请求数据了。

 

 

3 一个packet,如果是视频里面最多解码出来一帧,如果是音频,可能解码出来好几帧。参考ffmpeg自带例子demuxing_decoding.c

 

4 librtmp,一个RTMPPacket结构体对象,描述的是一个flv文件中的一个完整的tag,包括tag头和tag body。

 

5 ffmpeg编译碰到的问题,环境是win7+ubuntu虚拟机,在Windows上git clone ffmpeg源码,然后拷贝到虚拟机的共享文件夹,再到ubuntu上编译ffmpeg

    这样子编译出错,./configure 找不到文件或目录,用在ubuntu上git clone ffmpeg的源码,这样才行。

 

6 ffmpeg编译的问题,自己首先编译了出了libcdio.so,libcdio的所有函数都编译到这个so里面去了,但是configure里面检查开启了libcdio之后需要用到三个so库,

    “if enable libcdio.....,”没有找到另外两个库,所以后面die,编译失败,如果注释这个die这一句,编译的时候就会提示找不到libcdio的头文件。

    所以不能这么改,注释掉没有用到的另外两个so就好了。记录一下这个问题。

 

7 yuv420转rgb

int r = yy+1.4075*(vv-128);
int g = yy - 0.3455*(uu-128) - 0.7169*(vv-128);
int b = yy + 1.779*(uu-128);

r = (r<0)?0:(r>255?255:r);
g = (g<0)?0:(g>255?255:g);
b = (b<0)?0:(b>255?255:b);

 

8 使用rtmp的metadata消息来携带自定义数据的话,发送过去的metadata信息里面要有个onMetaData字符串,拉流端的RTMP_Read函数才能拿到这个metadata。

 

9 有的时候播放文件,报moov atom not found错误,可能的原因是写文件的时候没有调用ffmpeg的WriteTailer。

 

10 使用librtmp推流的时候,有一个缺点没有设置ChunkSize,请参考http://www.cnblogs.com/oldmanlv/p/5487146.html。

 

11 使用wireShark抓rtmp的包的时候,软件没有给你显示消息分块的细节,它内部把分块的消息合并成一个完整的消息了。

 

12 ffmpeg 常用命令:

 

5.11 Advanced options

 

 

 

1 提取文件中的某个音频流到文件,操作音频流,视频流的命令都在这里

2 操作音频流里面的某个通道的命令也在上面,例如提取某个通道:

 

ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

 

记录一下FFmpeg在win7,msys2,vs2015的环境下的编译过程,支持libfdkaac,x264

 

    x264编译命令,下了个最新的x264(2018-3-18):./configure --prefix=./vsbuild --enable-shared --disable-thread --disable-asm --enable-debug --disable-opencl --disable-avs

    libfdkaac(0.1.6版本)库编译命令:./configure --prefix=/f/liudongping/fdk-aac-0.1.6/vsbuld --disable-static CC=cl CXX=cl (这样之后还修改了一下生成的makefile文件,LD=link),但是只能编译出静态库来。

    ffmpeg(3.4.2)编译配置命令:./configure --enable-libx264 --enable-libfdk-aac --enable-nonfree --enable-gpl --disable-shared --enable-static --prefix=./vs2015_build --enable-debug --toolchain=msvc --extra-ldflags=-LIBPATH:F:/ffmpeg/externlib/lib --extra-cflags=-IF:/ffmpeg/externlib/include

    其中libx264.lib,fdk-aac.lib(lib的名字必须这样命名)放在F:/ffmpeg/externlib/lib目录下面。

    include目录下面的内容是这样的

这样就可以成功make。但是在vs2015上使用这些静态库的时候要链接好几个windwos上的lib:

    #pragma comment(lib,"libavcodec")
    #pragma comment(lib,"libavdevice")
    #pragma comment(lib,"libavfilter")
    #pragma comment(lib,"libpostproc")
    #pragma comment(lib,"libavformat")
    #pragma comment(lib,"libavutil")
    #pragma comment(lib,"libswresample")
    #pragma comment(lib,"libswscale")
    #pragma comment(lib,"fdk-aac")
    #pragma comment(lib,"libx264")
    #pragma comment(lib,"Secur32.lib")
    #pragma comment(lib,"Vfw32.lib")
    #pragma comment(lib, "strmiids")

    #pragma comment(lib, "Shlwapi.lib")

这样就可以调试到ffmpeg的内部了,看来还是将ffmpeg编译为动态库比较好一些

 

14 记录一个问题,codecCtx的参数设置问题,libfdkaac编码,保存为m4a格式,

    但是编码处理的packet写入文件的时候报错,av_write_frame返回-1,提示opration not permitted,ffmpeg内部报错信息:

    Malformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

 

    原因是如果输出容器的格式有关AVOutputFormat mOutfmt:

                if( mOutfmt->flags & AVFMT_GLOBALHEADER )

 

{
codecctx->flags |= CODEC_FLAG_GLOBAL_HEADER;//如果有globalheader属性,codecctx需要设置这个

 

}

 

15 fdkaac编码,想要插入一段时间的静音帧,直接编码一个静音帧,得到packetdata,然后持续写入这一个packet,这样子是行不通的,

    应该把开始编码出来的第一帧当做静音帧保存起来。

 

16 使用android的MediaCodec 进行aac编码之后得到的是aac裸流,如果是用ffmpeg封装到mp4容器里面,可以直接当做packet.data写入到文件,不需要加adts头

 

17 ffmpeg 解码ape文件的packet的时候,一个packet很大,但是一次只解码了部分数据处理,但是解码函数返回0,这个时候只需要继续解码就行,直到解码函数返回一个>0的值,这个时候表示这个packet被解码完了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值