使用FFMpeg在Android客户端上进行RTSP流式传输

rur*_*tle 5 ffmpeg rtsp android-ndk

我正在开发一个业余爱好项目,其目标是开发一个Android应用程序,该应用程序能够使用FFMpeg作为底层引擎,在LAN设置中通过网络摄像头传输实时源.到目前为止,我做了以下 -

A.为以下版本编译和生成FFMpeg相关库 -

FFMpeg版本:2.0
NDK版本:r8e&r9
Android平台版本:android-16&android-18thisthisthisthis
工具链版本:4.6和4.8
平台构建于:Fedora 18(x86_64)

B.在适当的路径中创建文件Android.mk和Application.mk.

但是,当使用Java从应用程序层编写用于访问FFMpeg的适当功能的本机代码时,我坚持以下问题 -

a)我需要从本机到应用层提供哪些FFMpeg功能才能实现流式实时源?
b)为了编译Android的FFMpeg,我按照这个链接.编译选项是否足以处理*.sdp流或我是否需要修改它?
c)我是否需要使用live555?

我是FFMpeg和Android应用程序开发的新手,这将是我第一个针对Android平台的认真项目.我一直在寻找使用FFMpeg处理RTSP流的相关教程一段时间,但没有取得多大成功.此外,我尝试了VLC播放器的最新开发版本,发现它非常适合流式传输实时源.然而,这是一个复杂的野兽,我的项目的目标是非常有限的,主要是学习 - 在短时间内.

您能否就如何编写本地代码以利用FFMpeg库以及随后使用应用层中的这些功能来实时传输实时源提供一些指示(例如链接,文档或示例代码)?此外,如果您能从功能的角度(在语言无关的意义上)让我知道该项目所需的背景知识,我们将非常感激.

小智 1

前段时间我遇到过类似的情况(我想从 RTMP 服务器流式传输 mp3),这非常令人沮丧。然而,我设法拼凑了一些代码,这些代码实际上完成了它应该做的事情。一些提示:

  • 您不想将 ffmpeg 的 API 暴露给您的 Java 代码。相反,请考虑创建辅助函数,例如openRTSPStream(String url)并将 ffmpeg 内容保留在 C/C++ 代码中。我这样说是因为 ffmpeg大量使用指针和动态内存分配,这会让尝试从 Java 中使用它变得很痛苦。

  • 用于编译库的脚本使用该标志--disable-everything,这也意味着它可能禁用 RTSP 支持。我建议您删除该标志或使用、、、和(或类似的内容)运行configure脚本,以了解您需要启用什么。您需要记住视频和音频的格式和编码以及您将其解码的内容。--list-protocol--list-demuxer--list-muxer--list-encoder--list-decoder

  • 当您从流中读取数据包时,您的本机代码可以通过回调函数将缓冲区发送到 Java 代码,该回调函数又将缓冲区显示为视频/音频。

这是您可能感兴趣的另一篇文章:Record RTSP Stream with FFmpeg libavformat

如果您需要一些示例代码或进一步说明,请告诉我。