7

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

不知道如何用这些资源插入我的功能,这是我迄今为止尝试过的: 1. 使用 System.loadLibrary() 将库加载到我的 Activity 中,然后将 ffmpeg 可执行文件复制到资产文件夹,在运行时我复制到我的然后我使用 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 文件)的帮助将不胜感激。

4

3 回答 3

3

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

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

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

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

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

于 2013-02-08T08:00:39.987 回答
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://在命令行中使用协议,只需指定输入文件的绝对路径即可。stdout并尝试通过获取其和stderr流的实例来记录FFmpeg进程的输出......

于 2013-03-08T15:21:45.757 回答
0

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

于 2013-02-26T23:22:33.130 回答