【问题标题】:How do I reduce the video size captured by the default camera using FFMPEG in Android?如何在 Android 中使用 FFMPEG 减小默认摄像头捕获的视频大小?
【发布时间】:2011-12-05 00:36:19
【问题描述】:

我正在尝试减小 Android 中默认摄像头(它正在生成高分辨率视频)捕获的视频大小。 FFMPEG 是否具有对具有给定分辨率的视频进行编码的属性?我试过谷歌,但所有示例都使用 FFMPEG 的命令行模式。

我的问题是:

  1. 我们可以在 Android 中使用 ffmpeg 命令行吗?
  2. 如果没有,我们将如何实现?
  3. 我们可以在 Android 中直接使用 ffmpeg 录制视频吗?
  4. 还有其他解决方案吗?

【问题讨论】:

  • 嗨 hemal,对不起,我认为您共享的链接是用于 .net 的,但我需要它用于 android (JAVA)。并且您正在尝试在命令行中执行 ffmpeg。问题是我知道如何在 android 中运行命令行方法,但问题是默认情况下 ffmpeg 可执行文件不会出现在 android 设备中,所以 ffmpeg 必须是我的应用程序的一部分,我认为我必须在本地调用它。
  • 糟糕,是的,我之前的回答是针对 .net。我不知道您所说的本地调用是什么意思,我认为您可以使用ProcessBuilder。更大的问题是在设备上获取ffmpeg 二进制文件。你应该能够重新分发它,这样你就可以将它与你的应用程序捆绑在一起。
  • 是的,我可以将 ffmpeg 与我的应用程序捆绑在一起。但现在的问题是我必须编写一个实际使用 ffmpeg 库的 c/c++ 代码,我将从 java 调用该本地 c/c++ 方法。
  • 不能用ProcessBuilder执行ffmpeg吗?

标签: java android c++ c ffmpeg


【解决方案1】:

可以为 android 编译 ffmpeg,也可以从命令行运行 ffmpeg。除非您需要比命令行提供的更高级的用法,否则无需深入研究本机代码和 jni 调用。

作为参考,这是我运行编译ffmpeg的shell脚本(在Ubuntu下运行,比windows容易多了)

#!/bin/bash


ANDROID_API=android-3
export ANDROID_NDK=${HOME}/android-ndk
export ANDROID_SDK=${HOME}/android-sdk
SYSROOT=$ANDROID_NDK/platforms/$ANDROID_API/arch-arm
ANDROID_BIN=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86/bin/
CROSS_COMPILE=${ANDROID_BIN}/arm-linux-androideabi-
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools

export ARM_ROOT=${HOME}android-ndk
export ARM_INC=$ARM_ROOT/platforms/android-5/arch-arm/usr/include
export ARM_LIB=$ARM_ROOT/platforms/android-5/arch-arm/usr/lib
export LIB_INC=${HOME}/include
export LIB_LIB=${HOME}/lib
CFLAGS=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP "
LDFLAGS=" -nostdlib -Bdynamic  -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc "

FLAGS="--target-os=linux --enable-cross-compile --cross-prefix=$CROSS_COMPILE --arch=arm --prefix=$HOME --disable-shared --enable-static --extra-libs=-static --extra-cflags=--static --enable-small --disable-asm --disable-yasm --disable-amd3dnow --disable-amd3dnowext --disable-mmx --disable-mmx2 --disable-sse --disable-ssse3 --disable-indevs"
export CFLAGS=$EXTRA_CFLAGS
export LDFLAGS=$EXTRA_LDFLAGS
./configure $FLAGS --extra-cflags="$CFLAGS" --extra-ldflags="$LDFLAGS" \
--cc="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}" --extra-ldflags="$LDFLAGS" \
--cxx="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}" \
--nm="${CROSS_COMPILE}nm" \
--ar="${CROSS_COMPILE}ar"
make clean
make -j4 || exit 1
make install || exit 1

至于运行 ffmpeg,首先你需要将 ffmpeg 复制到应用程序的文件目录中,使用 getRuntime.exec() chmod 755 如下所示,然后使用以下行运行 ffmpeg:

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

现在,将相机的输入以它可以理解的格式输入到 ffmpeg 是一个难题,我仍在努力解决这个问题。我有一个关于该主题的 stackoverflow 问题:Decode android's hardware encoded H264 camera feed using ffmpeg in real time

【讨论】:

  • 您好,感谢您的回复。我做了你提到的一切。我使用您的脚本编译ffmpeg,然后将其复制到应用程序的文件目录,chmod 755 它。到目前为止一切都很好,但是当我尝试调用 ffmpeg 时,什么也没发生,它既不会抛出任何错误,也不会生成输出文件。
  • 进程 p = Runtime.getRuntime().exec("/data/data/yourpackagename/files/ffmpeg -i in.mp4 out.mp4"); p.waitFor();返回退出代码 1,我认为这意味着 ffmpeg 内部发生了一些内部错误
  • 好吧,我不能和你分享我的代码,但我可以告诉你,如果你想找出问题所在,你应该创建一个 datainputstream 来获取 ffmpeg 的标准输出和标准错误流过程。不要运行 p.waitFor(),而是设置某种循环来将进程输出写入您可以读取的位置。 ffmpeg 很可能只是没有找到输入,您可以在 getRuntime.exec 命令中设置启动环境位置,以便您可以使用“in.mp4”等相对目录。
  • 感谢您的回复。它现在正在运行,但问题是它只是继续进行!我给了一个 9MB 3gp 文件作为输入,它生成 0 字节文件作为输出,然后在后台继续运行(等待 20 分钟)。你需要多少时间
  • 那么您是否正在获取标准输出/错误流以查看发生了什么? ffmpeg 运行多长时间实际上取决于您正在执行的操作,如果您有管道或流式输入,它甚至可以无限期地运行,在这种情况下您必须手动关闭该进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多