我有一个包含音频/视频流的流。视频编码为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
中的选定流?
VideoView
,其中包含一个字段android.net.rtp.AudioCodec
,我可以想象这个班级会很有用。如何解决?
答案 0 :(得分:0)
如果你想在显示它之前操纵一个流,不幸的是你在Android设备上遇到了棘手的领域 - 如果你确实有可能在服务方面进行转换它可能会更容易(和你一样)通常也应该在服务器端有更多的“马力”。
假设您确实需要在服务器端进行转换,那么您可以使用的技术是将视频从服务器流式传输到您的应用,根据需要进行转换,然后从应用中的localhost服务器“流式传输”到您应用中的VideoView。大致的步骤是:
我相信这种方法的一个例子是LibMedia:当然:http://libeasy.alwaysdata.net(注意,这不是一个免费的图书馆,AFAIK)。
对于实际转换,你可以按照你的建议使用ffmpeg - 你可以使用或查看设计自己的一些用于Android项目的ffmpeg包装器。一些例子:
如果您打算编写赢得的包装器,请查看第二个链接中有关libffmpeginvoke的注释。
有一点需要注意的是,压缩技术,特别是视频压缩,通常使用一种方法,即相对于之前的帧(有时甚至是之后的帧)压缩一个数据包或帧。例如,第一帧可能是“关键帧”,接下来的五帧可能只包含数据以解释它们与关键帧的区别,第七帧可能是另一个关键帧,依此类推。这意味着如果要将块从一种格式转换为另一种格式,通常需要一个具有所有必需关键帧的“块”。
我认为从PCM转换为AAC音频不会有这个问题,但无论如何都要注意这个概念。