如何在Android中使用FFMPEG缩小默认摄像头捕获的video大小?

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

我的问题是:

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

可以为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复制到应用程序的文件目录中,chmod 755使用getRuntime.exec(),如下所示,然后使用以下行运行ffmpeg:

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

现在,将相机的输入以ffmpeg的forms输入到它能够理解的格式是很难的,我仍然想弄清楚。 我有一个关于主题的stackoverflow问题: 使用ffmpeg实时解码android的硬件编码H264相机源