【问题标题】:FFMPEG API -- How much do stream parameters change frame-to-frame?FFMPEG API——流参数逐帧改变多少?
【发布时间】:2015-12-02 22:52:45
【问题描述】:

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

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

  • 色彩空间和样本格式也会逐帧变化吗?
  • 这些变化是暂时的(单帧)还是持久的(重要的帧块)?有没有办法预测这个流会发生什么行为?
  • 有没有办法找到这个流可能产生的最具描述性的属性,这样我就可以放大所有质量较低的帧,但不能提供比源质量更高的结果,甚至如果这是我无法提前播放所有帧的设备或网络流?

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

【问题讨论】:

  • 不要问标记为cc++ 的问题而不参考您拥有的代码。谢谢。
  • 感谢您的通知。

标签: ffmpeg libavcodec libav


【解决方案1】:

所以,除了@szatmary says,流参数更改的典型用例是自适应流:

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

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

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

【讨论】:

  • 感谢您提供最佳答案。 ffmpeg api 的模棱两可似乎有点不幸;我现在正在研究 gstreamer。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 2011-10-27
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2012-07-05
    • 2023-03-13
    • 2016-03-20
    • 2020-01-09
    相关资源
    最近更新 更多