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

5
我正在开发一个兴趣项目,目标是开发一个能够使用FFMpeg作为底层引擎,在局域网设置下通过网络摄像头实时流传输的Android应用程序。到目前为止,我已经完成以下工作 -
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,我按照this链接进行操作。这些编译选项是否足以处理*.sdp流,或者我需要进行修改?
c)我需要使用live555吗?

我完全不了解FFMpeg和Android应用程序开发,这将是我在Android平台上的第一个严肃项目。我一直在寻找相关的教程,涉及使用FFMpeg进行RTSP流媒体传输,但没有太大的成功。此外,我尝试了最新的VLC播放器开发版本,并发现它非常适合流式传输实时数据。然而,它是一个复杂的工具,我的项目目标相当有限,主要是学习 - 在短时间内。

您能否提供一些指针(例如链接、文档或示例代码),告诉我如何编写原生代码来利用FFMpeg库,并随后从应用程序层面使用这些功能来流式传输实时数据?此外,如果您可以让我知道从功能角度(以语言无关的方式)必要的背景知识,我将非常感激。


我正在尝试创建一个可以播放延迟小于1秒的rtsp播放器。看起来你已经做了一些工作,能否在这里指导我? - user2934930
我想在安卓上使用FFmpeg播放和录制RTSP流。我对FFmpeg没有很好的了解。 - Bhavesh Desai
1个回答

1

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

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

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

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

这里有另一篇可能会对您感兴趣的SO帖子: 使用FFmpeg libavformat记录RTSP流

如果需要一些示例代码或进一步解释,请告诉我。


抱歉回复晚了,大家。到目前为止,我已经能够通过遵循Stephen Dranger的教程和Arash Shafiei的repo的更新版本,读取本地存储的视频文件并逐帧保存。为了将音频和视频流渲染到Android上,我正在使用SDL 2.0。因此,目前正忙于集成FFMpeg和SDL以实现我的目的。我发现Oliver Xorange的GitHub repo提供了Android视频播放器,这可能对寻找解决方案的人有所帮助。 - rurtle
谢谢更新!如果你在某些地方卡住了,告诉我,我们可以一起解决。 - Raman Lalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接