FFMPEG API - 流参数在帧到帧之间变化多少?

时间:2015-09-07 11:35:04

标签: ffmpeg libavcodec libav

我尝试使用ffmpeg从设备和文件中提取原始流。我注意到关键帧信息(视频:宽度,高度,像素格式,色彩空间,音频:样本格式)都存储在AVCodecContext和AVFrame中。这意味着我可以在播放流之前访问它,我可以为每个帧访问它。

我需要多少考虑这些值的帧到帧变化?我发现https://ffmpeg.org/doxygen/trunk/demuxing__decoding_8c_source.html#l00081表示至少宽度,高度和像素格式可能会逐帧更改。

  • 颜色空间和样本格式是否也会逐帧更改?
  • 这些更改是暂时的(单帧)还是持久的(一个重要的帧块),是否有任何方法可以预测此流将发生哪种行为?
  • 有没有办法找到这个流可以生成的最具描述性的属性,这样我就可以扩展所有质量较低的帧,但是不能提供比源更高质量的结果,甚至如果这是设备或网络流,我无法提前播放所有帧?

基本问题是:如何通过限制原始流(我的输出)无法在流中指定流属性的更改来解决此API的灵活性。我想我需要预测最具描述性的属性来提供流,或者在属性发生变化时提供新的流。做出哪个选择取决于这些值是快速变化还是保持相对稳定。

2 个答案:

答案 0 :(得分:2)

因此,要添加到@szatmary says,流参数更改的典型用例是自适应流:

  • 想象一下,你在笔记本电脑上用各种互联网连接方式观看youtube,突然带宽减少了。您的流将自动切换到较低的带宽。 FFmpeg(由Chrome使用)需要支持此功能。
  • 或者,想象一下rtc视频聊天中的类似场景。

FFmpeg做它所做的事情的原因是因为API基本上试图适应共同点。在手机上拍摄的视频无法改变分辨率。大多数视频也不会从视频编辑软件中导出。即使来自youtube-dl的视频通常也不会切换分辨率,这是客户端的决定,而youtube-dl根本就不会这样做。那你该怎么办?我只是使用来自第一帧的流信息,并将所有后续帧重新缩放到该分辨率。这将适用于案件的99.99%。您是否希望将此服务容纳到剩余的0.01%,取决于您认为人们将上传的视频类型以及在此背景下分辨率更改是否有意义。

色彩空间会改变吗?他们可以(理论上)在软件中将屏幕录制与视频片段混合,但实际上不太可能(实际上)。样本格式与视频分辨率一样频繁变化:在自适应场景中经常出现,但您是否关心取决于您希望获得的服务和视频类型。

答案 1 :(得分:0)

通常不经常或永远。但是,这是基于编解码器,并且是在编码时选择的选项。为了以防万一,我通过swscale传递解码的帧。