2013-02-07 93 views
7

से ffserver को स्ट्रीम करने के लिए कैसे करें मुझे एक एंड्रॉइड कैमरा/फ़ाइल से रिमोट 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 

तो बुनियादी तौर पर मैं एंड्रॉयड से ऊपर ऐसा करने में सक्षम होना चाहता हूँ। कई खोजों के बाद मैंने अभी तक यह किया है - मैं इस लिंक पर आया http://bambuser.com/opensource जिसमें से मैंने ffmpeg स्रोत डाउनलोड किया और इसे बनाया। निर्माण आउटपुट कई चीजें: 1. साझा libs [libavcodec, libavcore, libavdevice, libavfilter, libavformat, libavutil, libswscale] 2. निष्पादनयोग्य [ffmpeg, ffprobe]

नहीं

यकीन है कि कैसे इन संसाधनों के साथ मेरी कार्यक्षमता प्लग करने के लिए इस मैंने अभी तक कोशिश की है: 1. System.loadLibrary() का उपयोग करके मेरी गतिविधि में libs को लोड किया गया है तो ffmpeg निष्पादन योग्य को संपत्ति फ़ोल्डर में कॉपी किया गया है जो रनटाइम पर मैंने अपने एप्लिकेशन की "फ़ाइलें" निर्देशिका में कॉपी की है, फिर मैं अनुमतियां सेट करता हूं Runtime.getRuntime()। exec() का उपयोग कर निष्पादन योग्य।

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

2. कॉपी किया ffmpeg.c, साझा पुस्तकालयों और "" फ़ोल्डर है कि मेरे JNI फ़ोल्डर में निर्माण से उत्पन्न हुआ है और कहा: तो अंतिम चरण निम्नलिखित बयान के साथ जावा में यह निष्पादित करने के लिए था एक jni फ़ंक्शन जो ffmpeg.c में मुख्य() फ़ंक्शन के आसपास लपेटता है। इस दृष्टिकोण के साथ मुझे अपने आप को ndk-build के सफल होने के लिए ffmpeg स्रोत से कई शीर्षलेख फ़ाइलों की प्रतिलिपि बनाना पड़ता है और मुझे संदेह है कि यह जाने का तरीका है या नहीं।

उपर्युक्त दो दृष्टिकोण मेरे लिए काम नहीं करते हैं, मुझे यकीन नहीं है कि मैं कहां गलत हो रहा हूं, इसलिए एंड्रॉइड से एक एमपी 4 फ़ाइल की तरह एक साधारण ffmpeg स्ट्रीमिंग करने के तरीके पर कोई मदद की सराहना की जाएगी।

उत्तर

3

मुझे यह एपोरैच 2 का उपयोग करके काम कर रहा है, यह मैंने किया है। 1. ffmpeg.c, "शामिल" फ़ोल्डर और मेरे प्रोजेक्ट के जेनी फ़ोल्डर में साझा पुस्तकालयों की प्रतिलिपि बनाई गई। इस ब्लॉग पोस्ट http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  • वहाँ कई त्रुटियाँ थीं जबकि NDK के साथ निर्माण के संदर्भ में

    1. संशोधित ffmpeg.c तो मैं बस याद आ रही निर्भरता जब तक अंत में निर्माण सफल गयी।

    पर पहली बार एप्लिकेशन शुरू होगा और फिर तुरंत बाहर निकलते हैं, यह बातें मैं करना भूल के एक जोड़े की वजह से था तो सुनिश्चित करें कि आप अपने आप को कुछ घंटे और बालों के झड़ने को बचाने के लिए निम्न कार्य किया है सुनिश्चित करें: - मैनिफेस्ट पर इंटरनेट अनुमति सेट करें (यदि मीडिया फ़ाइल एसडीकार्ड में है, तो बाहरी स्टोरेज अनुमति लिखें और सुनिश्चित करें कि एसडीकार्ड घुड़सवार है) - सुनिश्चित करें कि दूरस्थ ffserver चल रहा है और सही तरीके से कॉन्फ़िगर किया गया है। आप डेस्कटॉप से स्ट्रीमिंग द्वारा पुष्टि कर सकते हैं - सुनिश्चित करें कि आपके पास सही पैराम

    अब मैं अपने एसडीकार्ड में एक दूरस्थ ffserver में एक mp4 फ़ाइल से स्ट्रीम कर सकता हूं, अभी तक डिवाइस कैमरे से स्ट्रीमिंग करने का प्रयास नहीं किया है।

  • +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  
    

    , एंड्रॉयड एनडीके आवश्यक है और here से डाउनलोड किया जा सकता है। NDK डाउनलोड करें और अपने /home/<username> निर्देशिका को निकालने या फिर अपनी आवश्यकताओं के अनुसार स्क्रिप्ट को अनुकूलित ...

    और यह भी आदेश पंक्ति में file:// प्रोटोकॉल का उपयोग कर से बचने के लिए, बस इनपुट फ़ाइल का पूर्ण पथ निर्दिष्ट। और F0mpeg प्रक्रिया से आउटपुट को लॉग इन करने का प्रयास करेंऔर stderr धाराओं के गेटिन 'उदाहरण ...

    +0

    क्या आपके पास ffserver के लिए बाइनरी है ?? कहीं भी बाइनरी नहीं मिल सकती है – yeahman