【发布时间】:2014-12-21 18:38:41
【问题描述】:
鉴于 FFmpeg 是领先的多媒体框架,并且大多数视频/音频播放器都使用它,我想知道使用 FFmpeg 作为中间体的音频/视频播放器的一些事情。
我正在学习,我想知道音频/视频播放器的工作原理,我有一些问题。
我正在阅读 ffplay 源代码,我看到 ffplay 处理字幕流。我尝试使用带有字幕的 mkv 文件,但不起作用。我尝试使用诸如 -sst 之类的参数,但什么也没发生。 - 我正在阅读字幕以及视频文件如何使用它(或者我可以说容器?)。我看到有两种放置字幕的方法:hardsubs 和 softsubs - 粗略地说 hardsubs 模式被刻录并成为视频的一部分,softsubs 变成一个字幕流(我可能错了 - 请纠正我)。
问题是:他们如何处理这个问题?我的意思是,当字幕是视频的一部分时,无事可做,视频流本身会显示字幕,但是软字幕呢?他们是如何处理的? (我也听说过一些关于文本潜艇的事情)。 - 字幕如何出现在屏幕上,可以配置更改字体、大小、颜色,而无需重新编码所有内容?
我正在研究一些视频播放器的源代码,其中一些或大部分使用 OpenGL 作为帧的渲染器,而另一些则使用(例如 Qt 的 QWidget)(某种或肯定的)画布。 - 什么是最常用的,哪一个是最快和更好的?带有着色器和东西的OpenGL?处理 YUV 或 RGB 等?它是如何工作的?
这可能是一个转储问题,但 AVFrame 返回的格式是什么?例如,当我们想先将帧保存为图像时,我们需要帧然后进行转换,我们从哪种格式转换?它是根据视频编解码器而变化还是始终相同?
我一直在尝试处理的大多数视频都使用 YUV720P,我尝试将帧保存为 png,我需要先转换为 RGB。我和玩家做了一个测试,我把它们放在同一个帧上,我还截屏并进行了比较。视频播放器显示的帧更加丰富多彩。我对使用 SDL(OpenGL)的 ffplay 进行了同样的尝试,帧的颜色(质量)似乎非常低。可能是什么?他们做什么?是着色器(还是一种魔法?哈哈)。
嗯,我想现在就是这样。我希望你能帮助我。
如果这不是正确的地方,请告诉我在哪里。我还没有在 Stack Exchange 社区中找到其他位置。
【问题讨论】:
-
ffmpeg 可以使用 libass 渲染软字幕,您也可以只使用 ffmpeg 对字幕流进行解复用而不渲染它。渲染视频流的“最佳”解决方案取决于平台,OpenGL 几乎是硬件加速渲染的最佳“共同点”。至于颜色魔法,操作系统和驱动程序有时会在视频流上使用过滤器,进入这些设置并禁用“增强”
-
感谢您回答@PeterT。字幕渲染是将字幕转换为图像还是必须在获得字幕流后进行渲染?是文字还是图片? - 例如,如果ffmpeg demux 字幕流并返回,如果它是文本流,程序员负责以某种方式呈现它,它通常是如何完成的?是否可以使用OpenGL并绘制字幕流文本? - 希望你能理解我的问题。
-
如果您已经研究过
ffplay的资源,为什么不自己深入研究 ffmpeg 的库? -
@alk - 我正在这样做(至少在尝试),但欢迎任何帮助。
-
ffmpeg 对字幕的支持并不完全整洁。
标签: c++ c ffmpeg libavcodec libav