共计 1677 个字符,预计需要花费 5 分钟才能阅读完成。
视频花屏 / 卡顿原因
- 如果 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
正文完
发表至:无分类
2019-07-04