ffmpeg开发知识点回顾

42次阅读

共计 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

正文完
 0