视频播放器问题

时间:2014-10-26 12:41:43

标签: c++ c ffmpeg libavcodec libav

鉴于FFmpeg是领先的多媒体框架,大多数视频/音频播放器使用它,我想知道有关使用FFmpeg作为中间体的音频/视频播放器的事情。

我正在学习,我想知道音频/视频播放器是如何工作的,我有一些问题。

我正在阅读ffplay源代码,我看到ffplay处理字幕流。我尝试使用带有字幕的mkv文件,但不起作用。我尝试使用诸如-sst这样的参数但没有发生任何事情。 - 我正在阅读有关字幕以及视频文件如何使用它的信息(或者我可以说容器?)。我看到有两种方式放一个副标题:hardsubs和softsubs - 大概说硬盘模式被烧掉并成为视频的一部分,而softsubs变成了一个字幕流(我可能错了 - 拜托,纠正我)。

  • 问题是:他们如何处理这个问题?我的意思是,当副标题是视频的一部分时,没有什么可做的,视频流本身就会显示副标题,但是softsubs呢?他们是如何处理的? (我也听说过关于文字潜艇的事情)。 - 如何在屏幕上显示字幕,并且可以配置更改字体,大小,颜色,而无需再次编码所有内容?

  • 我正在研究一些视频播放器源代码,其中一些或大部分使用OpenGL作为框架的渲染器,而其他人使用(例如Qt的QWidget)(有点或肯定)画布。 - 什么是最常用的,哪一个最快,更好? OpenGL与着色器和东西?处理YUV或RGB等?这有什么作用?

  • 这可能是转储问题,但AVFrame返回的格式是什么?例如,当我们首先想要将帧保存为图像时,我们需要帧然后转换,我们从哪种格式转换?它是根据视频编解码器改变还是总是相同的?

  • 我一直试图处理的大部分视频都是使用YUV720P,我试图将帧保存为png,我需要先转换为RGB。我和玩家一起做了一个测试,我放在相同的框架上,我也拍了截图并进行了比较。视频播放器显示帧更丰富多彩。我尝试使用SDL(OpenGL)的ffplay,并且帧的颜色(质量)似乎非常低。可能是什么?他们做什么?它是着色器(还是一种魔术?哈哈)。

嗯,我认为现在就是这样。我希望你帮助我。

如果这不是正确的地方,请告诉我在哪里。我还没有在Stack Exchange社区找到另一个地方。

1 个答案:

答案 0 :(得分:0)

一篇文章中有很多问题:

  

如何处理'软字幕'

与任何其他流的方式相同:

  1. 从数据包读取数据包到容器
  2. 将数据包发送给解码器
  3. 根据需要使用已解码的帧。这里有大多数支持字幕的容器,呈现时间将会出现。此时您只需获取文本并在同一演示时间将其刻录到图像上。有很多方法可以在视频上打印文本,使用ffmpeg或其他库
  4.   

    最常用的渲染器是哪个,哪个是最快更好的?

    1. 最常用的取决于底层系统。例如,Qt只包装本机渲染器,甚至还有一个openGL版本
    2. 您只能与底层系统允许的速度一样快。它是否支持双缓冲?它可以以您的解码像素格式渲染,还是之前必须执行颜色转换?这个话题太宽泛了
    3. 最好只依赖于用例。这太宽泛了
    4.   

      AVFrame返回的格式是什么?   它是一种原始格式(enum AVPixelFormat),取决于编解码器。有一个list of YUV and RGB FOURCCs涵盖了ffmpeg中的大多数格式。以编程方式,您可以访问表AVCodec::pix_fmts以获取特定编解码器支持的像素格式。