【问题标题】:Play 'unsupported' codec in VideoView在 VideoView 中播放“不支持”的编解码器
【发布时间】:2015-05-14 17:36:25
【问题描述】:

我有一个包含音频/视频流的流。视频编码为 H.264 AVC,音频编码为 G.711 µ-law (PCMU)。 (我无法控制输出格式。)

当我尝试将视频显示到 VideoView 帧中时,设备说它无法播放视频。我猜那是因为 Android 不支持上述音频编码。

有没有办法以某种方式在VideoView 中显示选定的流?

  • 我可以只使用 Java 代码 sn-p 来“计算”编解码器吗?我看过 android.net.rtp.AudioCodec 类,它包含一个字段 PCMU,我可以想象这个类会很有用。
  • 或者我是否必须在我的应用程序中插入一个库或一些本机代码 (FFmpeg) 并使用它?如果是,怎么做?

如何解决?

【问题讨论】:

  • 您是否必须在流式传输时实时转换,或者您可以下载完整视频然后进行转换?下载之后再做会容易很多,但我猜你没有这个选项?
  • @Mick 确实是连续流,不是分隔文件。
  • 你有解决办法吗?

标签: java android video codec


【解决方案1】:

如果您想在显示流之前对其进行操作,那么不幸的是,您在 Android 设备上遇到了棘手的问题 - 如果您确实有可能在服务端进行转换,那么它可能会容易得多(而且您通常在服务器端也应该有更多的“马力”)。

假设您确实需要在服务器端进行转换,那么您可以使用的一种技术是将视频从服务器流式传输到您的应用程序,根据需要进行转换,然后从应用程序中的本地主机服务器“流式传输”到应用中的 VideoView。大致步骤如下:

  • 像往常一样从服务器流式传输加密文件,“逐块”
  • 在您的 Android 设备上,从流中读取并在收到每个块时对其进行转换
  • 在您的 Android 设备上使用 localhost http 服务器,现在将转换后的块“提供”到 MediaPlayer(媒体播放器应设置为使用指向您的 localhost http 服务器的 URL)

我相信,这种方法的一个例子是 LibMedia:当然:http://libeasy.alwaysdata.net(注意,这不是免费库,AFAIK)。

对于实际转换,您可以按照您的建议使用 ffmpeg - 有许多适用于 Android 项目的 ffmpeg 包装器,您可以使用或查看以设计自己的。一些例子:

如果您打算编写您的 won wrapper,请查看第二个链接中有关 libffmpeginvoke 的注释。

需要注意的一点是,压缩技术,尤其是视频压缩,通常使用一种方法,即一个数据包或帧相对于它之前的帧(有时甚至是它之后的帧)进行压缩。例如,第一帧可能是“关键帧”,接下来的五帧可能只包含解释它们与关键帧有何不同的数据,第七帧可能是另一个关键帧,依此类推。这意味着如果要将块从一种格式转换为另一种格式,您通常需要一个具有所有必需关键帧的“块”。

我认为从 PCM 转换为 AAC 音频不会有这个问题,但无论如何了解这个概念很有用。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 2019-05-21
    • 1970-01-01
    • 2013-03-31
    • 2021-10-24
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多