2013-02-07 3 views
7

안드로이드 카메라/파일에서 내 비디오를 브로드 캐스트하는 원격 ffserver로 스트리밍해야합니다.안드로이드에서 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 

합니다. 여러 번 검색 한 결과, 지금까지 내가 한 것입니다.이 링크를 통해 ffmpeg 소스를 다운로드하고 빌드 한 http://bambuser.com/opensource을 발견했습니다. 빌드 출력을 몇 가지 : 1. 공유 libs와 [위해 libavcodec, libavcore, libavdevice, libavfilter, libavformat, libavutil, libswscale] 2. 실행 [는 FFmpeg, ffprobe]

하지 이러한 자원 내 기능을 연결하는 방법을 잘이 나는 지금까지 시도한 바있다. 1. System.loadLibrary()를 사용하여 나의 액티비티에 libs를로드 한 다음 실행시에 애 플리케이션의 "파일"디렉토리에 복사 한 assets 폴더에 ffmpeg 실행 파일을 복사했다. Runtime.getRuntime(). exec()를 사용하여 실행 파일을 만듭니다. 내 JNI 폴더에 빌드에 의해 생성 및 추가 된

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

2. 복사 ffmpeg.c, 공유 라이브러리와 "포함"폴더 : 다음 마지막 단계는 다음 문을 자바를 실행하는 것이 었습니다 ffmpeg.c의 main() 함수를 감싸는 jni 함수. 이 접근 방식을 사용하면 자신이 ndk 빌드를위한 ffmpeg 소스에서 여러 헤더 파일을 복사해야한다는 것을 알았고 성공하려면이 방법이 의심 스럽습니다.

위의 두 가지 접근 방식은 나를 위해 일했습니다. 어디서 잘못 될지 모르겠으므로 안드로이드에서 mp4 파일처럼 스트리밍하는 간단한 ffmpeg를 수행하는 방법에 대한 도움을 주시면 매우 감사하겠습니다.

답변

3

apporach 2를 사용하여 작업하게되었습니다. 이것은 내가 한 일입니다. 1. ffmpeg.c, "include"폴더와 공유 라이브러리를 프로젝트의 jni 폴더에 복사했습니다. 마지막으로 빌드가 성공 될 때까지 NDK로 구축하는 동안 몇 가지 오류가있었습니다이 블로그 게시물 http://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  • 을 참조

    1. 수정 ffmpeg.c 그래서 난 그냥 누락 된 종속성을 추가했다.

    에서 처음 앱을 시작할 것 다음 즉시 그렇게 확신 당신은 자신에게 약간의 시간과 탈모 저장하려면 다음을 수행했는지 확인 내가 깜빡 몇 가지에 기인 종료 : 를 - 매니페스트에 대한 인터넷 사용 권한을 설정하십시오 (미디어 파일이 sdcard에있는 경우 외부 저장소 사용 권한을 설정하고 sdcard가 마운트되었는지 확인하십시오) - 원격 ffserver가 실행 중이며 올바르게 구성되었는지 확인하십시오. 바탕 화면에서 스트리밍하여 확인할 수 있습니다. - 올바른 매개 변수를 전달했는지 확인하십시오.

    이제 내 sdcard의 mp4 파일에서 원격 ffserver로 스트리밍 할 수 있습니다. havnt는 아직 장치 카메라에서 스트리밍을 시도했습니다.

  • +0

    누락 된 종속성을 해결할 샘플 프로젝트가 있습니까? – StackOverflowed

    0

    공유 라이브러리 및 포함 폴더를 복사 할 필요가 없습니다. 대신 Andriod.mk의 "PREBUILD_SHARED_LIBRARY"기능을 사용할 수 있습니다.

    3

    은이 질문에 대답하기 조금 늦은 것 같다,하지만 당신은 해결책을 필요로하는 경우, 여기

    음, 저도 같은 문제로하지만 첫 번째 접근 방식을 통해 해결 방법을 고안했다 ... 하나 컴파일 된 는 FFmpeg 진보다는 JNI ...

    첫째을 사용하여, 지금까지 그것은 나에게 것 같이이 Bambuser에서 제공하는 빌드가 너무 오래된 및 는 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  
    

    , 안드로이드 : 차라리 여기

    이 하나를 생성하는 데 사용할 수있는 스크립트의 ... 정의는 FFmpeg 소스 최신에서 자신의 바이너리를 구축하는 게 좋을 것 NDK이 필요하며 here에서 다운로드 할 수 있습니다. 바로 입력 파일의 절대 경로를 지정 NDK을 다운로드하여 /home/<username> 디렉토리로 추출하거나 다른 사용자의 필요에 따라 스크립트를 사용자 정의 ...

    을 또한 명령 줄에서 file:// 프로토콜을 사용하지 마십시오. FFmpeg 프로세스의 출력을 gettin '의 stdoutstderr 스트림으로 기록하려고 시도하십시오.

    +0

    너희들은 ffserver 용 바이너리를 가지고 있니? 어느 곳에서나 바이너리를 찾을 수 없다. – yeahman

    관련 문제