怎样减少在Android中使用FFMPEG默认的摄像头拍摄的视频的大小?摄像头、大小、视频、Android

2023-09-05 04:35:01 作者:相忘于江湖

我试图降低默认的摄像头拍摄的视频大小(它产生的高清晰度视频)的Andr​​oid系统。请问 FFMPEG 有一个属性为en codeA与给定的分辨率的视频?我试图谷歌,但所有的例子都使用命令行模式FFMPEG。

我的问题是:

我们可以使用的ffmpeg的命令行中的Andr​​oid? 如果没有,那么我们将如何实现的呢? 可我们的视频,直接使用ffmpeg的Andr​​oid中能够记录? 有没有其他的解决方案呢? 解决方案

ffmpeg的编译Android的可能,以及运行命令行的ffmpeg。有没有必要深入到本地code和JNI调用,除非你需要更高级的用法比在命令行中提供。

作为参考,这是shell脚本我运行编译的ffmpeg(Ubuntu的下运行,这让事情变得比Windows更容易)

 #!/斌/庆典


ANDROID_API =机器人-3
出口ANDROID_NDK = $ {HOME} / Android的NDK
出口ANDROID_SDK = $ {HOME} / Android的SDK
SYSROOT = $ ANDROID_NDK /平台/ $ ANDROID_API /弓臂
ANDROID_BIN = $ ANDROID_NDK /工具链/ ARM-Linux的androideabi-4.4.3 / prebuilt / *  -  86 /斌/
CROSS_COMPILE = $ {ANDROID_BIN} / ARM-Linux的androideabi-
出口PATH = $ PATH:$ ANDROID_SDK /工具:$ ANDROID_SDK /平台工具

出口ARM_ROOT = $ {HOME}的Andr​​oid NDK
出口ARM_INC = $ ARM_ROOT /平台/ Android的-5 /弓臂/ usr / include目录
出口ARM_LIB = $ ARM_ROOT /平台/ Android的-5 /弓臂/ usr / lib目录
出口LIB_INC = $ {HOME} /包括
出口LIB_LIB = $ {HOME} / lib目录
CFLAGS =-I $ ARM_INC -fPIC -DANDROID -fpic -mthumb-互通-ffunction截面-funwind桌-fstack,保护了-fno-short-枚举-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march =用于ARMv5TE -mtune =的XScale -msoft流通-mthumb -Os -fomit-frame-pointer的-fno严格走样-finline-上限= 64 -DANDROID -Wa, -  noexecstack -MMD -MP
LDFLAGS =-nostdlib -Bdynamic轮候册, - 没有未定义-Wl,-z,noexecstack -Wl,-z,nocopyreloc轮候册,-soname,/系统/ lib中/ libz.so -Wl,-rpath链接= $ ARM_LIB,-dynamic-链接= /系统/斌/连接器-L $ ARM_LIB -nostdlib $ ARM_LIB / crtbegin_dynamic.o $ ARM_LIB / crtend_android.o -lc -lm -ldl -lgcc

标志= - 目标OS = Linux的--enable-交叉编译--cross- preFIX = $ CROSS_COMPILE --arch =手臂 -  preFIX = $ HOME  - 禁用共享--enable -static --extra-库= -static --extra-CFLAGS =  - 静态--enable-小 - 禁用ASM  - 禁用YASM  - 禁用amd3dnow  - 禁用amd3dnowext  - 禁用MMX  - -disable-MMX2 --disable-SSE  - 禁用SSSE3  - 禁用indevs
出口CFLAGS = $ EXTRA_CFLAGS
出口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}纳米\
--ar =$ {} CROSS_COMPILE AR
使清洁
让-j4 || 1号出口
使安装|| 1号出口
 

至于运行ffmpeg的,首先你需要复制的ffmpeg到应用程序的文件目录下,文件模式755它采用getRuntime.exec(),如下图所示,然后运行的ffmpeg用下面一行:

 进程p =调用Runtime.getRuntime()。EXEC(/数据/数据​​/ yourpackagename /文件/的ffmpeg -i in.mp4 out.mp4)
 

现在,进入相机的输入的格式很能体会到​​FFmpeg的是艰难的位,我仍然试图找出。我有一个计算器问题正在进行的主题:De$c$c Android的硬件连接codeD H264摄像头饲料使用的ffmpeg实时

音视频开发一 编译Android端使用的FFmpeg库

I am trying to reduce the video size captured by the default camera (it's generating high resolution video) in Android. Does FFMPEG have a property to encode a video with given resolution? I tried to Google, but all examples are using command line mode for FFMPEG.

My questions are:

Can we use ffmpeg command line in Android? If not then how we will achieve it? Can we able record a video directly using ffmpeg in Android? Is there any other solution for this?

解决方案

Compiling ffmpeg for android is possible, as well as running ffmpeg from command line. There's no need to delve into native code and jni calls unless you need more advanced usage than what the command line provides.

For reference, this is the shell script I run to compile ffmpeg (run under Ubuntu, it makes things a lot easier than 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

As for running ffmpeg, first you need to copy ffmpeg into your application's files directory, chmod 755 it using getRuntime.exec() as shown below, then run ffmpeg with the following line:

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

Now, getting the camera's input to ffmpeg in a format it can understand is the tough bit, which I'm still trying to figure out. I've got a stackoverflow question going on the topic: Decode android's hardware encoded H264 camera feed using ffmpeg in real time