如何从android流式传输到ffserver

如何从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 所以基本上我希

我需要从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
所以基本上我希望能够从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文件夹中

  • 参考这篇博客文章修改了ffmpeg.c

  • 使用ndk构建时出现了几个错误,所以我只是添加了缺少的依赖项,直到最终构建成功

  • 起初,应用程序会启动,然后立即退出,这是由于我忘记了做一些事情,所以请确保您已完成以下操作,以节省一些时间和脱发: -在清单上设置internet权限(如果媒体文件位于SD卡中,请设置写入外部存储权限并确保SD卡已装入) -确保远程ffserver正在运行并正确配置。您可以从桌面通过流式传输进行确认 -确保传递了正确的参数


    现在,我可以从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的二进制文件吗??在任何地方都找不到二进制文件