在VideoView中播放“不支持”的编解码器

时间:2015-05-13 14:56:26

标签: java android video codec

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

当我尝试将视频显示到search: for (i = 0; i < array.length; i++) { for (j = 0; j < array[i].length; j++) { if (array[i][j] == searchfor) { break search; } } } 帧时,设备会说它无法播放视频。我猜这是因为Android不支持上述音频编码。

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

  • 我可以使用Java代码段来“计算”编解码器吗?我见过班级VideoView,其中包含一个字段android.net.rtp.AudioCodec,我可以想象这个班级会很有用。
  • 或者我是否必须将库或某些本机代码(FFmpeg)插入到我的应用程序中并使用它?如果是,怎么样?

如何解决?

1 个答案:

答案 0 :(得分:0)

如果你想在显示它之前操纵一个流,不幸的是你在Android设备上遇到了棘手的领域 - 如果你确实有可能在服务方面进行转换它可能会更容易(和你一样)通常也应该在服务器端有更多的“马力”。

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

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

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

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

如果您打算编写赢得的包装器,请查看第二个链接中有关libffmpeginvoke的注释。

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

我认为从PCM转换为AAC音频不会有这个问题,但无论如何都要注意这个概念。