2013-02-07 54 views
7

我需要從android攝像頭/文件流式傳輸到遠程ffserver,它將廣播我的視頻。我可以通過發出這樣的命令在Ubuntu做桌面上:如何從android中流式傳輸到ffserver

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加載到我的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,共享庫和「包括」文件夾是由構建生成到我的JNI的文件夾,並添加包含ffmpeg.c中main()函數的jni函數。通過這種方法,我發現自己必須從ffmpeg源文件中複製幾個頭文件,以便ndk-build成功,並且我非常懷疑這是否應該走。

以上兩種方法havnt爲我工作,我不知道我要去哪裏錯了,所以任何幫助如何做一個簡單的ffmpeg流如android的mp4文件將不勝感激。

回答

3

我通過使用apporach 2得到了它的工作,這就是我所做的。 1.將ffmpeg.c,「include」文件夾和共享庫複製到我項目的jni文件夾中。

  1. 參照這篇博客http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  2. 而與NDK構建有幾個錯誤修改ffmpeg.c,所以我剛纔添加缺少的依賴,直到最終構建成功。

起初,應用程序將啓動,然後立即退出,這是由於兩件事我忘了這樣做,確保你已經做了以下保存自己一些時間和脫髮: - 設置清單上的互聯網權限(如果媒體文件在SD卡中,請設置寫入外部存儲權限並確保安裝了SD卡) - 確保遠程ffserver正在運行並正確配置。你可以通過從桌面流式傳輸確認 - 確保你傳遞了正確的參數

現在我可以從我的SD卡中的mp4文件流到遠程ffserver,havnt試圖從設備攝像頭流式傳輸。

+0

您是否有示例項目來修復缺失的依賴關係? – StackOverflowed

0

您不必複製共享庫和包含文件夾。您可以使用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/<username>目錄或其他自定義腳本,按您的需求...

,也避免使用file://協議在命令行中,只指定輸入文件的絕對路徑。並嘗試通過其stdoutstderr流的gettin實例記錄FFmpeg進程的輸出...

+0

你們是否有ffserver的二進制文件?無法在任何地方找到任 – yeahman