如何从android流式传输到ffserver
我需要从android摄像头/文件流到远程ffserver,该服务器将播放我的视频。我可以在ubuntu的桌面上通过发出如下命令来实现:如何从android流式传输到ffserver,android,android-ndk,ffmpeg,Android,Android Ndk,Ffmpeg,我需要从android摄像头/文件流到远程ffserver,该服务器将播放我的视频。我可以在ubuntu的桌面上通过发出如下命令来实现: ffmpeg -f video4linux2 -s 640x480 -r 25 -i /dev/video0 http://192.168.0.20:8090/cam1.ffm 或者像这样流式处理文件: ffmpeg -i /home/kev/share/movie.mp4 http://192.168.0.20:8090/cam1.ffm 所以基本上我希
ffmpeg -f video4linux2 -s 640x480 -r 25 -i /dev/video0 http://192.168.0.20:8090/cam1.ffm
或者像这样流式处理文件:
ffmpeg -i /home/kev/share/movie.mp4 http://192.168.0.20:8090/cam1.ffm
所以基本上我希望能够从android上完成上述工作。经过几次搜索,这就是我到目前为止所做的——我找到了这个链接,从中我下载了ffmpeg源代码并构建了它。构建输出了几个方面:
1.共享libs[libavcodec、libavcore、libavdevice、libavfilter、libavformat、libavutil、libswscale]
2.可执行文件[ffmpeg,ffprobe]
不确定如何使用这些资源插入我的功能这是我迄今为止尝试的:
1.使用System.loadLibrary()在我的活动中加载LIB,然后将ffmpeg可执行文件复制到assets文件夹,在运行时我将该文件夹复制到应用程序的“文件”目录,然后使用runtime.getRuntime().exec()设置可执行文件的权限。最后一步是使用以下语句在java中执行它:
Runtime.getRuntime().exec("ffmpeg -i file:///android_asset/movie.mp4http://<server>:8090/cam1.ffm");
Runtime.getRuntime().exec(“ffmpeg-ifile:///android_asset/movie.mp4http://:8090/cam1.ffm");
二,。将ffmpeg.c、共享库和生成的“include”文件夹复制到我的jni文件夹中,并添加了一个jni函数,该函数环绕ffmpeg.c中的main()函数。使用这种方法,我发现自己必须从ffmpeg源中复制几个头文件,以使ndk构建成功,我高度怀疑这是否是可行的方法
以上两种方法对我都不起作用,我不知道我哪里出了问题,因此,如果您能帮助我制作简单的ffmpeg流媒体,比如android的mp4文件,我将不胜感激。我使用apporach 2实现了这一点,这就是我所做的。 1.将ffmpeg.c、“include”文件夹和共享库复制到我的项目的jni文件夹中
现在,我可以从SD卡中的mp4文件流式传输到远程ffserver,但还没有尝试从设备摄像头流式传输。您不必复制共享库和包含文件夹。您可以改用Andriod.mk的“预构建共享库”功能。回答这个问题似乎有点晚了,但如果您需要解决方案,这里有一个 嗯,我设计了一个解决相同问题的方法,但是通过第一种方法,即使用编译的FFmpeg二进制文件,而不是JNI 首先,在我看来,Bambuser提供的构建太旧了,FFmpeg有一个恶性循环。。。 因此,我建议您根据最新的FFmpeg源定制您自己的二进制文件 下面是一个脚本,可用于生成一个脚本:
#!/bin/bash
echo ""
echo " ********** FFmpeg Android Build ********** "
echo ""
NDK=$HOME/android-ndk-r8d
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
PREFIX=$HOME/FFmpeg.Binaries.Android
FFMPEG_BASE=$HOME/FFmpeg.Build
if [ -d "$FFMPEG_BASE" ]; then
rm -v -r -f $FFMPEG_BASE
fi
if [ -d "$PREFIX" ]; then
rm -v -r -f $PREFIX
fi
mkdir $FFMPEG_BASE
mkdir $PREFIX
# x264 Installation
echo ""
echo " ********** libx264 Installation ********** "
echo ""
cd $FFMPEG_BASE
git clone --depth 1 git://git.videolan.org/x264
cd $FFMPEG_BASE/x264
./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
make
sudo make install
sudo ldconfig
#FFmpeg Installation
echo ""
echo " ********** FFmpeg (Android) Installation ********** "
echo ""
cd $FFMPEG_BASE
# git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd $FFMPEG_BASE/ffmpeg
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-nonfree \
--enable-version3 \
--enable-gpl \
--disable-doc \
--enable-avresample \
--enable-demuxer=rtsp \
--enable-muxer=rtsp \
--disable-ffserver \
--disable-ffprobe \
--enable-ffmpeg \
--enable-ffplay \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-protocol=rtp \
--enable-hwaccels \
--enable-zlib \
--extra-cflags="-I$PREFIX/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L$PREFIX/lib"
make -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
# rm -v -r -f $FFMPEG_BASE
clear
echo ""
echo "FFmpeg Android Build Successful..."
echo ""
ls -l -R $PREFIX
exit
要使上述脚本正常工作,Android NDK是必需的,可以从下载。下载NDK并解压缩到/home/
目录,或者根据需要自定义脚本
同时避免在命令行中使用
文件://
协议,只需指定输入文件的绝对路径即可。并尝试通过获取其stdout
和stderr
流的实例来记录FFmpeg进程的输出 你们有一个样本项目来修复缺失的依赖项吗?你们有ffserver的二进制文件吗??在任何地方都找不到二进制文件