2013-02-07 6 views
7

streamen Ich muss von einer Android-Kamera/Datei zu einem entfernten ffserver streamen, der mein Video ausstrahlt. Ich kann dies in ubuntu auf dem Desktop, indem Sie einen Befehl ausgeben wie:Wie zu ffserver von Android

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

oder eine Datei wie dieser Strom:

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

Also im Grunde möchte ich von Android die oben tun können. Nach mehreren Suchanfragen habe ich das bisher gemacht - ich bin auf diesen Link http://bambuser.com/opensource gestoßen, von dem ich die ffmpeg-Quelle heruntergeladen und aufgebaut habe. Die Build-Ausgänge mehrere Dinge: 1. Shared Libs [libavcodec, libavcore, libavdevice, libavfilter, libavformat, libavutil, libswscale] 2. Executables [ffmpeg, ffprobe]

Nicht sicher, wie meine Funktionalität mit diesen Ressourcen stopfen diese Was ich bisher versucht habe: 1. habe die libs in meiner Activity mit System.loadLibrary() geladen und dann die ausführbare Datei ffmpeg in den Ordner Assets kopiert, den ich zur Laufzeit in das Verzeichnis "files" meiner Anwendung kopiert habe und dann Berechtigungen für gesetzt habe die ausführbare Datei mit Runtime.getRuntime(). exec(). dann war der letzte Schritt in Java mit der folgenden Anweisung auszuführen:

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

2. kopiert ffmpeg.c, die gemeinsam genutzte Bibliotheken und den „include“ Ordnern, der von dem Build zu meinem jni Ordner erstellt wurde und hinzugefügt Eine jni-Funktion, die die Funktion main() in ffmpeg.c umschließt. Bei diesem Ansatz musste ich mehrere Header-Dateien aus der ffmpeg-Quelle kopieren, damit der ndk-build erfolgreich war, und ich bezweifle stark, dass dies der richtige Weg ist.

Die oben genannten zwei Ansätze havnt arbeitete für mich, ich bin nicht sicher, wo ich falsch liege, so dass jede Hilfe, wie man eine einfache ffmpeg Streaming wie eine mp4-Datei von Android würde sehr geschätzt werden.

Antwort

3

Ich habe es funktioniert mit dem Einsatz von 2, das ist, was ich getan habe. 1. kopiert ffmpeg.c, den Ordner "include" und die gemeinsam genutzten Bibliotheken in den jni-Ordner meines Projekts.

  1. modifizierte ffmpeg.c mit Bezug auf diesen Blog-Post http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  2. es mehrere Fehler aufgetreten sind, während sie mit NDK Aufbau so habe ich nur noch die fehlenden Abhängigkeiten, bis schließlich der Build erfolgreich war.

Zunächst wird die App starten und beenden dann sofort würde dies der Dinge, um ein paar aufgrund war ich zu tun vergessen, so stellen Sie sicher, dass Sie die folgenden sparen Sie sich einige Stunden und Haarausfall getan haben: - setze internet permission auf manifest (wenn die mediadatei in sdcard ist, setze die write external storage berechtigung und vergewissere dich, dass die sdcard gemountet ist) - stelle sicher, dass der entfernte ffserver korrekt läuft und konfiguriert ist. Sie können bestätigen durch Streaming von einem Desktop - stellen Sie sicher, dass Sie die richtigen Parameter übergeben haben

Jetzt kann ich von einer mp4-Datei in meiner SD-Karte zu einem Remote-FFstream streamen, hat versucht, Streaming von der Gerätekamera noch.

+0

Haben Sie ein Beispielprojekt, um die fehlenden Abhängigkeiten zu beheben? – StackOverflowed

0

Sie müssen keine gemeinsam genutzten Bibliotheken kopieren und keinen Ordner hinzufügen. Sie können stattdessen die Funktion "PREBUILD_SHARED_LIBRARY" von Andriod.mk verwenden.

3

Es scheint ein bisschen spät zu sein, um diese Frage zu beantworten, aber wenn Sie eine Lösung benötigen, ist hier ein ...

Nun, ich hatte eine Abhilfe für das gleiche Problem entwickelt, aber durch den ersten Ansatz, der ist unter Verwendung einer kompilierten FFmpeg Binary statt JNI ...

Erstens, soweit es mir scheint, baut die zur Verfügung gestellt von Bambuser sind viel zu alt und FFmpeg hat einen Teufelsentwicklungszyklus. .. Also Ich würde eher vorschlagen, um benutzerdefinierten Ihre eigene binären aus der aktuellen FFmpeg Quelle zu bauen ...

Hier ist ein Skript, das man generieren verwendet werden könnte:

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

Für das obige Skript zu arbeiten, Android NDK ist erforderlich und kann von here heruntergeladen werden. Laden Sie den NDK und extrahiert, um Ihr /home/<username> Verzeichnis oder aber passen Sie das Skript nach Ihren Bedürfnissen ...

Und auch vermeiden, das file:// Protokoll in der Befehlszeile verwenden, geben Sie einfach den absoluten Pfad der Eingabedatei. Und versuchen Sie, die Ausgabe aus dem FFmpeg-Prozess zu protokollieren, indem Sie Instanzen seiner stdout und stderr Streams ...

+0

habt ihr die binary für ffserver? kann nirgendwo eine Binärdatei finden – yeahman

Verwandte Themen