我有一个带有音频/视频流的流。视频编码为H.264 AVC,音频编码为G.711 µ-law(PCMU)。(我无法控制输出格式。)
当我尝试将视频显示到VideoView
框架中时,该设备说它无法播放视频。我想那是因为Android不支持上述音频编码。
有没有办法以某种方式在VideoView
中显示所选流?
- 我可以只使用Java代码段来"计算"编解码器吗?我已经看过包含字段
PCMU
的类android.net.rtp.AudioCodec
,我可以想象该类将很有用。 - 我是否必须将库或某些本机代码(FFMPEG)插入我的应用程序?如果是,如何?
如何修复它?
如果您想在显示流之前操纵流,不幸的是,您正在进入Android设备上的棘手区域 - 如果您确实有可能在发球方面进行转换可能会更容易(您通常还应该在服务器端具有更多的"马力")。
假设您确实需要在服务器端转换,那么您可以使用的技术就是将视频从服务器流式传输到您的应用程序,然后根据需要将其转换为应用程序,然后从应用程序中的Localhost服务器"流"到您的应用程序中的视频。大致步骤是:
- 像往常一样从服务器中流传输加密文件,'块by块'
- 在您的Android设备上,从流中读取并在接收到每个块时转换
- 在您的Android设备上使用Localhost HTTP服务器,现在将转换后的块"服务"到MediaPlayer(应设置媒体播放器以使用指向您Localhost HTTP Server的URL) )
我认为,这种方法的一个例子是libmedia:sure:http://libeasy.alwaysdata.net(注意,这不是免费的库,afaik)。
对于实际转换,您可以按照您的建议使用FFMPEG - 用于Android Projects的许多FFMPEG包装器您可以使用或寻找自己的设计。一些例子:
- http://hiteshsondhi88.github.io/ffmpeg-android-java/
- https://github.com/jhotovy/android-ffmpeg
在第二个链接中查看有关libffmpeginvoke的注释,尤其是如果您打算编写Won包装器。
要注意的一件事是,压缩技术,特别是视频压缩,通常使用一种方法,其中一个数据包或框架相对于之前的帧被压缩(有时甚至是其后的框架)。例如,第一帧可能是"关键帧",接下来的五个帧可能只包含数据来解释它们与关键框架的不同,而第七帧可能是另一个关键帧等等。这意味着您通常需要一个"块",如果您将块从一种格式转换为另一种格式,则具有所有必需的密钥帧。
我认为您不会将这个问题从PCM转换为AAC音频,但是无论如何都要意识到这个概念。