将 FFmpeg 与 Android-NDK 一起使用
Posted
技术标签:
【中文标题】将 FFmpeg 与 Android-NDK 一起使用【英文标题】:Using FFmpeg with Android-NDK 【发布时间】:2012-03-25 05:36:09 【问题描述】:我想将FFmpeg
与android-NDK
一起使用,我在这部分非常基础,我需要一些帮助,我之前在网上研究过这个主题,但没有得到满意的解决方案。
1 - 我如何通过 Windows 操作系统使用FFmpeg
。 (我不想用Ubuntu,请不要推荐。)
2 - 如何通过NDK
插入FFmpeg
命令?
最后通知:我使用android-ndk-r7b
和Cygwin
。
任何建议将不胜感激。
【问题讨论】:
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
构建ffmpeg
和x264
的教程:
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 一起使用