FFMPEG API -- 流参数逐帧改变多少?

FFMPEG API -- How much do stream parameters change frame-to-frame?

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

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

基本问题是:我如何解决这个 API 的灵​​活性问题,因为原始流(我的输出)没有任何方法可以在流中指定流属性的更改。我想我需要预测最具描述性的属性以提供流,或者在属性发生变化时提供新的流。做出哪种选择取决于这些值是会快速变化还是保持相对稳定。

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

因此,补充一下 ,流参数更改的典型用例是自适应流:

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

FFmpeg 之所以这样做,是因为 API 本质上是在尝试适应公分母。在 phone 上拍摄的视频永远不会改变分辨率。大多数视频也不会从视频编辑软件导出。即使来自 youtube-dl 的视频通常也不会切换分辨率,这是客户端的决定,而 youtube-dl 根本不会这样做。那你该怎么办?我只是使用第一帧的流信息并将所有后续帧重新调整为该分辨率。这将适用于 99.99% 的案例。您是否要让您的服务适应这剩余的 0.01% 取决于您认为人们会上传什么类型的视频,以及分辨率更改在这种情况下是否有意义。

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