2013-02-07 23 views
7

Muszę przesyłać strumieniowo z aparatu/pliku z Androidem do zdalnego serwera FTP, który będzie transmitować moje wideo. Mogę to zrobić na pulpicie w Ubuntu poprzez wydanie polecenia jak:Jak przesyłać strumieniowo do serwera FTP z Androidem

ffmpeg -f video4linux2 -s 640x480 -r 25 -i /dev/video0 http://192.168.0.20:8090/cam1.ffm 

lub strumieniowo plik tak:

ffmpeg -i /home/kev/share/movie.mp4 http://192.168.0.20:8090/cam1.ffm 

Więc zasadniczo chcę, aby być w stanie wykonać wyżej od Androida. Po kilku przeszukaniach to właśnie zrobiłem do tej pory - natknąłem się na ten link http://bambuser.com/opensource, z którego pobrałem źródło ffmpeg i zbudowałem je. Wyjścia zbudować kilka rzeczy: 1. wspólne libs [libavcodec, libavcore, libavdevice, libavfilter, muxera, libavutil, libswscale] 2. wykonywalne [ffmpeg, ffprobe]

Nie wiesz jak podłączyć mój funkcjonalność z tych zasobów to jest to, co próbowałem do tej pory: 1. wczytałem biblioteki w mojej Działalności za pomocą System.loadLibrary(), a następnie skopiowałem plik wykonywalny ffmpeg do folderu zasobów, który w czasie wykonywania kopiowałem do katalogu "files" mojej aplikacji, a następnie ustawiłem uprawnienia dla plik wykonywalny za pomocą Runtime.getRuntime(). exec(). następnie ostatnim krokiem było wykonanie go w java z następującym stwierdzeniem:

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

2. skopiowanym ffmpeg.c, współdzielonych bibliotek i folderu „include”, który został wygenerowany przez build do notatnika JNI i dodanej funkcja jni, która owija się wokół funkcji main() w ffmpeg.c. Przy takim podejściu musiałem skopiować kilka plików nagłówkowych ze źródła ffmpeg, aby ndk-build mógł się powieść, i bardzo wątpię, czy to jest droga, którą należy przejść.

Powyższe dwa podejścia sprawdziły się u mnie, nie jestem pewien, gdzie idę źle, więc jakakolwiek pomoc, jak zrobić proste strumieniowanie ffmpeg jak plik MP4 z Androida byłaby bardzo ceniona.

Odpowiedz

3

Mam to działa przy użyciu apporach 2, to jest to, co zrobiłem. 1. skopiowałem ffmpeg.c, folder "include" i udostępnione biblioteki do folderu jni mojego projektu.

  1. zmodyfikowany ffmpeg.c w odniesieniu do tego blogu http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  2. było kilka błędów podczas budowania z NdK więc po prostu dodaje brakujące zależności, aż w końcu udało się zbudować.

Początkowo aplikacja ruszy i wtedy natychmiast wyjść, to ze względu na kilka rzeczy zapomniałem zrobić więc upewnij się, że zrobiłeś następujące czynności, aby zaoszczędzić sobie trochę godzin i wypadanie włosów: - ustawić uprawnienie do Internetu w manifeście (jeśli plik multimedialny znajduje się w sdcard, ustawić uprawnienia zapisu zewnętrznego i upewnić się, że sdcard jest zamontowany) - upewnij się, że serwer FTP jest poprawnie uruchomiony i skonfigurowany. możesz potwierdzić, przesyłając strumieniowo z pulpitu - upewnij się, że masz poprawne parametry przekazane

Teraz mogę przesyłać strumieniowo z pliku mp4 w moim sdcard do zdalnego serwera FTP, havnt próbował streaming z aparatu urządzenia jeszcze.

+0

Czy masz przykładowy projekt, który naprawia brakujące zależności? – StackOverflowed

0

Nie trzeba kopiować udostępnionych bibliotek i dołączać folderu. Zamiast tego możesz użyć funkcji "PREBUILD_SHARED" w Andriod.mk.

3

Wydaje się być trochę późno, aby odpowiedzieć na to pytanie, ale jeśli potrzebne jest rozwiązanie, oto jeden ...

Cóż, miałem opracowali obejście tego samego problemu, ale za pierwszym podejściem, które jest stosując skompilowany FFmpeg Binary zamiast JNI ...

po pierwsze, o ile wydaje mi się, kompilacje świadczone przez Bambuser są zbyt stare i FFmpeg ma błędne cykl rozwoju. .. Tak Wolałbym proponuję zwyczaj budowania własnego binarnego z najnowszym FFmpeg Źródło ...

Oto skrypt, który może być używany do generowania jednego:

#!/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  

Na powyższy skrypt do pracy, Android NDK jest wymagany i można go pobrać z here. Pobierz NDK i rozpakować do katalogu /home/<username> albo dostosować scenariusz jak na swoje potrzeby ...

A także uniknąć przy użyciu protokołu file:// w wierszu poleceń, wystarczy podać bezwzględną ścieżkę do pliku wejściowego. I spróbuj zarejestrować dane wyjściowe z procesu FFmpeg, pobierając instancje strumieni stdout i stderr ...

+0

czy macie binarne pliki? nie można znaleźć żadnego pliku binarnego w dowolnym miejscu – yeahman

Powiązane problemy