【问题标题】:Custom File Format And Codec?自定义文件格式和编解码器?
【发布时间】:2009-10-21 00:42:35
【问题描述】:

我被编解码器问题搞砸了好几天,但仍然看不到大局。这是我第一次处理音频/视频格式和编解码器。所以我真的需要一些帮助。 这是工作。

我正在编写几个负责编码和解码自定义 mpeg 文件的组件。在标准解/压缩过程(音频和视频)之上,我将实现一些自定义解/加密。为此编写编解码器和软件库。列出了我无法弄清楚的事情。

  • 对于 WMP,编解码器定位策略是什么。
  • 例如,我如何区分我的自定义文件格式和 mpeg-3 格式。什么是标准和编程结构。 (我真正搞砸的部分是容器格式,视频格式,fourcc代码等,把我逼死)
  • 对于 Windows 上的这项工作,您建议使用哪种方法编写编解码器(DMO 或过滤器)

我希望在您的帮助下解决列出的问题。信息和一些有用的链接将不胜感激。除了 MSDN :) 因为我找不到我正在搜索的内容。

【问题讨论】:

    标签: video audio directshow windows-media-player codec


    【解决方案1】:

    对于 WMP,编解码器定位于什么位置 政策。

    在 Windows Media Player 7.0 之前,它只是一个纯粹的 DirectShow 播放器。从 7.0 开始,Microsoft 开始以不同的方式处理不同的文件类型。这主要是 WMV 文件的情况。 WMP 现在将在 Vista 和 7 中对某些文件类型使用 MediaFoundation 媒体管道。

    如何区分我的自定义文件 例如 mpeg-3 格式的格式。 什么是标准和编程 为此的结构。 (我是真实的部分 搞砸了就是这个。容器格式, 视频格式,fourcc 码...等 把我逼死)

    could do this(大声笑,对不起 MSDN 链接),如果您正在创建自己的自定义容器格式,但如果您想让自己的生活更轻松,我会选择现有的和/或开源的容器,例如 AVI 或 MKV。当您以其中任何一种格式创建流时,您需要提供编解码器代码,例如用于视频的fourcc 或用于音频的格式标签。由于您正在做自己的自定义格式,您应该只制作自己的fourcc或格式标签值,但注意不要选择一个已经使用的人。

    假设您使用的是 AVI。内置的 avi demux 将读取 AVI 标头并查看文件中每个流的元数据。它可能会找到一个带有fourcc DX50 的视频流和一个带有WAVE_FORMAT_PCM 格式标签的音频流。 DirectShow 将枚举已注册的过滤器并查询它们的引脚以查看它们是否支持获取 DX50 视频或 WAVE_FORMAT_PCM 音频。因此,如果您的 AVI 有一个 4cc 的 XXXX,DirectShow 将枚举过滤器以查找采用 XXXX 的类型。然后,您将制作一个将接受fourcc XXXX 的转换过滤器。您的转换过滤器将解码视频并输出未压缩的格式。也许RGB24。 DirectShow 将检测到您的输出引脚输出该媒体类型,并可能将其直接连接到渲染器。音频的过程是相同的,除了我们处理格式标签而不是fourccs(你处理WAVEFORMATEX和VIDEOINFOHEADER)。

    For this work on Windows what method do you suggest to write codec(DMO or Filter)
    

    我从未亲自编写过 DMO,但我强烈建议您研究一下。我听说样板 COM 的东西和 IIRC 更少,MediaFoundation 有一个 DMO 包装器,所以你可能会得到自动的 MediaFoundation 支持。

    除了 DShow SDK 示例之外,您可能还想查看out this。可以帮助您入门。 this website 也有很好的样本,但可能不是你想要的。

    【讨论】:

    • 感谢您的回答。据我了解,处理fourcc和格式标签是由默认源过滤器处理的。然后它连接到我必须自己编写的相应变换过滤器。还有 2 个问题: 1- 对于音频,使用 mp3 格式的效果是什么。 2-我找不到用于放置fourcc代码的结构VIDEOINFOHEADER的元素。
    • 使用 MP3 格式没有任何效果。为了便于理解,假设 DSHOW 对 MP3 格式一无所知,并且 DSHOW 文档对 MP3 没有任何说明。对DShow来说,它只是你定义的另一种格式:) FourCC在VIDEOINFOHEADER的VIDEOINFOHEADER.bmiHeader.biCompression中。可能不明显的一件事是 AM_MEDIA_TYPE.subType 的前 4 个字节也将是fourcc! GUID 的其余部分将是 FORMAT_VideoInfo(FORMAT_VideoInfo 将是 majorType)
    • 谢谢耶利米。都对我有很大帮助。
    • 刚刚注意到我告诉你的内容有误! FORMAT_VideoInfo 我的意思是 MEDIATYPE_Video!
    • 我又来了 :) 在您的第一个链接中,我对这个“字节模式”有疑问。如果我做对了,我将通过这些规则定义我的文件相关格式。那么,根据这些规则,我是否必须以相应的文件格式(avi 或 mp3)定义我的自定义fourcc代码或波形标签??
    【解决方案2】:

    我认为没有足够的空间放置 cmets :)

    我终于通过你的回答和graphedit程序对过滤器和directshow有了一些了解。我将对音频和视频使用 AVI 容器。在内部,我将使用将由我的算法加密的 mpeg 格式。我将实现变换过滤器或 DMO。 (可能是 DMO)

    我想知道 AVI 拆分器如何将数据传送到我注册的编解码器。我的意思是数据的格式。我认为必须有一些标准。在我的研究过程中,我与 MSDN 达成了和解,但在单个格式的数据流中找不到有关实际缓冲区格式的信息。 (在我的情况下是 AVI)

    【讨论】:

    • 确实没有缓冲格式。您只需获得完整样本的缓冲区。例如,如果您在 AVI 中有一个压缩视频帧(使用您自定义的压缩/加密),AVI 分离器将通过您的输入引脚向您发送完整的帧样本。
    • 拆分器会向我发送帧的标题还是仅发送内容?
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多