ffmpeg开发知识点回顾
视频花屏/卡顿原因
- 如果GOP分组中的P帧丢失会造成解码端的图像发生错误
- 为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失,就不显示本GOP内的所有帧,直到下一个I帧来后,重新刷新图像。
时间基
- tbr: 帧率
- tbn:time base of stream
- tbc:time base of codec
时间戳
- PTS: Presentation timestamp
- DTS: Decoding timestamp
- I(intra)/B(bidirectional)/P(predicted)帧
时间戳顺序
- 实际帧顺序:I B B P
- 存放帧顺序:I P B B
- 解码时间戳:1 4 2 3
- 展示时间戳:1 2 3 4
从哪儿获得PTS
- AVPacket中的PTS
- AVFrame中的PTS
- av_frame_get_baset_effort_timstamp()
计算当前帧的PTS
- PTS=PTS * av_q2d(video_stream->time_base)
- av_q2d(AVRotional a){ return a.num/(double)a.den }
计算下一帧的PTS
- video_clock: 预测的下一帧视频的PTS
- frame_delay: 1/tbr
- audio_clock: 音频当前播放的时间戳
多媒体格式转换
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
- -i:输入文件
- vcodec copy:视频编码处理方式
- acodec copy:音频编码处理方式
该条命令的作用是将视频文件out.mp4格式转换为out.flv,音频编码方式保持不变,视频编码方式保持不变。
录音命令
ffmpeg -f avfoundation -i :0 out.wav
:0 代表音频设备
该条命令表示使用AVfoundation框架录制一段音频数据,数据来源是麦克风,输出文件是out.wav,录制完成之后,使用ffplay out.wav命令进行播放。
录屏命令
ffmpeg -f avfoundation -i 1 r 30 out.yuv
- -f: 指定使用AVfoundation采集数据
- -i: 指定从哪儿采集数据,它是一个文件索引号
- -r:指定帧率
该条命令表示使用AVfoundation框架,以30帧每秒的帧率录制屏幕,输出文件是out.yuv。使用ffplay可以进行播放,但是播放的时候需要制定屏幕尺寸和录制的数据格式,否则播放不出来。
ffmpeg滤镜命令
ffmpeg -i in.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
crop格式: crop=out_w:out_h:x:y
该命令表示对输入的in.mov文件进行宽和高的裁剪,以原始视频为中心进行宽和高分别减去200的裁剪,同时视频的编码格式使用libx264,音频的编码格式保持不变。
文件的删除与重命名
- avpriv_io_delete()
- avpriv_io_move()
码流基本概念
- SODB(String Of Data Bits),原始数据比特流,长度不一定是8的倍数,它是由VCL层产生
- RBSP(Raw Byte Sequence Payload,SODB + trailing bits),算法是在SODB最后一位补1,不安字节对齐则补零。
SPS & PPS
- SPS(Sequence Paramter Set),序列参数集,存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等。
- PPS(Picture Paramter Set)图像参数集,存放熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等。
H264压缩技术
- 帧内预测压缩,解决的是空域数据冗余问题
- 帧间预测压缩,解决的是时域数据冗余问题
- 整数离散余弦变换(DCT),将空间上的相关性变成频域上无关的数据然后进行量化。
- CABAC压缩。
直播推流/拉流
- 直播推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
- 直播拉流
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv