【问题标题】:How to stream to ffserver from android如何从android流式传输到ffserver
【发布时间】:2013-01-22 22:47:40
【问题描述】:

我需要从安卓相机/文件流式传输到远程 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 执行上述操作。经过几次搜索,这就是我到目前为止所做的 - 我遇到了这个链接http://bambuser.com/opensource,我从中下载了 ffmpeg 源并构建了它。构建输出了几件事: 1. 共享库 [libavcodec, libavcore, libavdevice, libavfilter,libavformat,libavutil,libswscale] 2. 可执行文件[ffmpeg,ffprobe]

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

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

2。将 ffmpeg.c、共享库和构建生成的“include”文件夹复制到我的 jni 文件夹中,并在 ffmpeg.c 中添加了一个环绕 main() 函数的 jni 函数。使用这种方法,我发现自己必须从 ffmpeg 源中复制几个头文件才能使 ndk-build 成功,我非常怀疑这是否是要走的路。

上述两种方法对我没有用,我不确定我哪里出错了,所以任何关于如何做一个简单的 ffmpeg 流式传输(如来自 android 的 mp4 文件)的帮助将不胜感激。

【问题讨论】:

    标签: android android-ndk ffmpeg


    【解决方案1】:

    我通过使用 apporach 2 让它工作,这就是我所做的。 1. 将ffmpeg.c、“include”文件夹和共享库复制到我项目的jni文件夹中。

    1. 参考这篇博文http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html修改了ffmpeg.c

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

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

    现在我可以从我的 sdcard 中的 mp4 文件流式传输到远程 ffserver,还没有尝试从设备摄像头流式传输。

    【讨论】:

    • 您有示例项目来修复缺少的依赖项吗?
    【解决方案2】:

    您不必复制共享库和包含文件夹。您可以改用 Andriod.mk 的“PREBUILD_SHARED_LIBRARY”功能。

    【讨论】:

      【解决方案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 是必需的,可以从here 下载。下载 NDK 并解压到您的 /home/&lt;username&gt; 目录,或者根据您的需要自定义脚本...

      并且还要避免在命令行中使用file://协议,只需指定输入文件的绝对路径即可。并尝试通过获取其stdoutstderr 流的实例来记录FFmpeg 进程的输出......

      【讨论】:

      • 你们有 ffserver 的二进制文件吗?在任何地方都找不到任何二进制文件
      猜你喜欢
      • 2019-10-04
      • 2012-02-27
      • 1970-01-01
      • 2012-03-22
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      相关资源
      最近更新 更多