我尝试使用ffmpeg从设备和文件中提取原始流。我注意到关键帧信息(视频:宽度,高度,像素格式,色彩空间,音频:样本格式)都存储在AVCodecContext和AVFrame中。这意味着我可以在播放流之前访问它,我可以为每个帧访问它。
我需要多少考虑这些值的帧到帧变化?我发现https://ffmpeg.org/doxygen/trunk/demuxing__decoding_8c_source.html#l00081表示至少宽度,高度和像素格式可能会逐帧更改。
基本问题是:如何通过限制原始流(我的输出)无法在流中指定流属性的更改来解决此API的灵活性。我想我需要预测最具描述性的属性来提供流,或者在属性发生变化时提供新的流。做出哪个选择取决于这些值是快速变化还是保持相对稳定。
答案 0 :(得分:2)
因此,要添加到@szatmary says,流参数更改的典型用例是自适应流:
FFmpeg做它所做的事情的原因是因为API基本上试图适应共同点。在手机上拍摄的视频无法改变分辨率。大多数视频也不会从视频编辑软件中导出。即使来自youtube-dl的视频通常也不会切换分辨率,这是客户端的决定,而youtube-dl根本就不会这样做。那你该怎么办?我只是使用来自第一帧的流信息,并将所有后续帧重新缩放到该分辨率。这将适用于案件的99.99%。您是否希望将此服务容纳到剩余的0.01%,取决于您认为人们将上传的视频类型以及在此背景下分辨率更改是否有意义。
色彩空间会改变吗?他们可以(理论上)在软件中将屏幕录制与视频片段混合,但实际上不太可能(实际上)。样本格式与视频分辨率一样频繁变化:在自适应场景中经常出现,但您是否关心取决于您希望获得的服务和视频类型。
答案 1 :(得分:0)
通常不经常或永远。但是,这是基于编解码器,并且是在编码时选择的选项。为了以防万一,我通过swscale传递解码的帧。