如何从安卓设备向ffserver进行流媒体传输

7
我需要将安卓相机/文件的视频流传输到远程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

所以基本上我想要在安卓系统上完成以上操作。经过多次搜索,我已经做了以下工作 - 我找到了这个链接http://bambuser.com/opensource,下载了ffmpeg源码并进行了构建。构建输出以下几个内容: 1.共享库[libavcodec,libavcore,libavdevice,libavfilter, libavformat,libavutil,libswscale] 2.可执行文件[ffmpeg,ffprobe]

不确定如何使用这些资源添加我的功能,所以我尝试了以下方法: 1. 使用System.loadLibrary()在我的Activity中加载库,然后将ffmpeg可执行文件复制到assets文件夹中,在运行时将其复制到应用程序的“files”目录中,并使用Runtime.getRuntime().exec()设置可执行文件的权限。最后一步是在Java中执行它,使用以下语句:

Runtime.getRuntime().exec("ffmpeg -i file:///android_asset/movie.mp4http://<server>:8090/cam1.ffm");

2. 我将编译生成的ffmpeg.c、共享库和“include”文件夹复制到了我的jni文件夹,并添加了一个jni函数,用来包装ffmpeg.c中的main()函数。采用这种方法,我发现自己不得不从ffmpeg源码中复制几个头文件才能使ndk-build成功,但我非常怀疑这是否是正确的做法。

以上两种方法对我都没有起作用,我不确定我哪里出错了。因此,对于如何实现在Android上简单地流式传输像mp4文件这样的视频文件,我非常感激任何帮助。

3个回答

3
我使用第二种方法让它正常工作,这是我所做的: 1. 将ffmpeg.c、“include”文件夹和共享库复制到我的项目jni文件夹中。
  1. 参考这篇博客文章修改ffmpeg.c。
  2. 在使用ndk构建时出现了几个错误,所以我添加了缺失的依赖项,直到最终构建成功。
刚开始应用程序会启动然后立即退出,这是因为我忘记做了一些事情,所以确保您已经完成以下操作,以节省一些时间和头发: - 在manifest上设置网络权限(如果媒体文件在sdcard中,则设置写外部存储权限并确保sdcard已安装) - 确保远程ffserver正在运行并正确配置。 您可以通过从桌面流式传输来确认 - 确保您传递了正确的参数
现在我可以从SD卡中的MP4文件流式传输到远程ffserver,但还没有尝试从设备相机进行流式传输。

你有一个修复缺失依赖项的示例项目吗? - StackOverflowed

3
似乎有点晚回答这个问题,但如果您需要解决方案,这里有一个…
我已经想出了一个解决同样问题的方法,但是采用的是第一种方法,即使用编译好的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/<username>目录中,或根据您的需求自定义脚本...
此外,请避免在命令行中使用file://协议,只需指定输入文件的绝对路径。并尝试通过获取其stdoutstderr流的实例来记录来自FFmpeg进程的输出...

你们有ffserver的二进制文件吗?我在任何地方都找不到二进制文件。 - yeahman

0

您不必复制共享库和包含文件夹。相反,您可以使用 Andriod.mk 的 "PREBUILD_SHARED_LIBRARY" 功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接