将 FFmpeg 与 Android-NDK 一起使用

Posted

技术标签:

【中文标题】将 FFmpeg 与 Android-NDK 一起使用【英文标题】:Using FFmpeg with Android-NDK 【发布时间】:2012-03-25 05:36:09 【问题描述】:

我想将FFmpegandroid-NDK 一起使用,我在这部分非常基础,我需要一些帮助,我之前在网上研究过这个主题,但没有得到满意的解决方案。

1 - 我如何通过 Windows 操作系统使用FFmpeg。 (我不想用Ubuntu,请不要推荐。)

2 - 如何通过NDK 插入FFmpeg 命令?

最后通知:我使用android-ndk-r7bCygwin

任何建议将不胜感激。

【问题讨论】:

iSUn 你解决了这个问题吗?我是否必须编译 ffmpeg 才能在 android 上运行它的命令?或者我可以在不编译的情况下运行它吗?你能解释一下程序吗? @ChaitanyaChandurkar 当然,你得先编译,把编译好的文件放到你的手机里,把权限改成chmod 775,然后你就可以用exec()方法运行命令了。 嗨@iSun..你完成了这个过程吗?你能解释一下如何使用 Windows 操作系统在 android 中使用 fmpeg 吗?我正在尝试使用 ffmpeg 压缩视频。但是我找不到任何合适的文档来使用 Windows 操作系统进行开发。可以给我样品吗?? 【参考方案1】:

从你的问题很难说出你到底想要/需要什么......所以这里有一些一般信息:

Using FFmpeg with Android Good starting point for FFmpeg on Android based on ndkr5 Another good starting point for building FFmpeg for Android 有关为 android 构建 FFmpeg 的有用信息,请参阅 here、here 和 here Make sure that you use Windows paths instead of /cydrive... when doing ffmpeg/android/cygwin/windows dev

如果您需要进一步的帮助,请准确说明您想要实现的目标以及无法实现的目标...

更新 - 根据 cmets:

要在 Android 上通过命令行使用 ffmpeg,您需要将 ffmpeg 复制到应用程序的 files 目录和 chmod 755 使用 getRuntime.exec() 然后您可以使用以下行运行 ffmpeg,例如:

Process p = Runtime.getRuntime().exec("/data/data/yourpackagename/files/ffmpeg -i infile.mp4 outfile.mp4")

【讨论】:

@iSun 当我问你说你想使用命令行时......现在你说你想使用 ffmpeg.so 这非常不同和复杂(需要 JNI 和其他东西!).. . 你到底需要什么? @iSun 我的意思是运行 ffmpeg 命令的所有相关文件...我无法回答究竟要复制什么,因为这取决于您如何编译和链接 ffmpeg(静态与动态,哪个编解码器/选项等)。 Yahia 如何在 Windows 上将 ffmpeg 设置为 chmod 755? @iSun 我不明白...为什么在 Windows 上?你说你在windows上开发,想在android手机上执行ffmpeg... @iSun 此解决方案仅在设备已植根时才有效。因此,您无法使用此方法发布应用,因为您需要在开发时将 ffmpeg 可执行文件推送到设备上。【参考方案2】:

我制作了一个关于如何为android 构建ffmpegx264 的教程: http://db.tt/TjMqIF3u

您还可以下载包含在android 上创建应用程序所需的文件的zip 文件,以及最新的ffmpeg 的可执行文件以在@​​987654329@ 上运行。

编辑:这确实是旧代码和旧编译过程。您可以在 FFMPEG docs

上找到更新的流程

【讨论】:

嗨。我在使用它时遇到问题...你能给我一个使用它的例子吗?一个 ffmpeg 命令谢谢。 我会尽量明确一点:我在 Android 应用程序中使用了 so 和 bin 文件和这个命令:String[] ffmpegCommand = "/data/data/com.mobvcasting.mjpegffmpeg/ffmpeg","-f", "image2", "-r", "1/5", "-i", Environment.getExternalStorageDirectory().getPath() + "/frames/frame_%d.jpg", "-c:v", "libx264", "-r", "30", Environment.getExternalStorageDirectory().getPath() + "/frames/video.mp4"; 通过这个命令,我收到了"Unknown input format: 'image2'"。删除"-f", "image2",我收到"/mnt/sdcard/frames/frame_%d.jpg: Protocol not found",我被困在这里。我正在使用这个 Android 代码:github.com/vanevery/Android-MJPEG-Video-Capture-FFMPEG 我想我找到了问题:你只指定了--enable-protocol=rtp ` - meaning that only rtp protocol can be used - this is what I understand from this, but I need to use Output:`协议:| .不幸的是,我无法编译 ffmpeg,因为我在 Windows 下。我可以请你帮忙编译使用 --enable-protocol=Output: 吗?非常感谢。 所以,我能够使用--enable-protocol=file \ 进行编译,这解决了与Protocol not found 相关的问题,但现在我遇到了另一个问题:/mnt/sdcard/frames/frame_%d.jpg: No such file or directory。我在 Android 应用程序中拥有所有权限。你知道现在可能出了什么问题吗?任何帮助都非常受欢迎。谢谢

以上是关于将 FFmpeg 与 Android-NDK 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg4.1编译:mac+android-ndk-14b+ffmpeg4.1成功编译

如何通过传递文件对象(而不是磁盘上文件的位置)将 ffmpeg 与 Python 一起使用

将ffmpeg与python一起使用,在找到END元素之前输入缓冲区已耗尽

android ffmpeg支持rmvb格式吗

如何用Android NDK编译FFmpeg

与ffmpeg一起使用自动方面