7

Android カメラ/ファイルから、ビデオをブロードキャストするリモート 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

だから基本的に私はAndroidから上記のことができるようにしたい. 何度か検索した後、これは私がこれまで行ってきたことです。このリンクhttp://bambuser.com/opensourceに出会い、そこから ffmpeg ソースをダウンロードしてビルドしました。ビルドはいくつかのものを出力します: 1. 共有ライブラリ [libavcodec、libavcore、libavdevice、libavfilter、libavformat、libavutil、libswscale] 2. 実行可能ファイル [ffmpeg、ffprobe]

これらのリソースを使用して機能をプラグインする方法がわからないこれは、これまでに試したことです。アプリケーションの「ファイル」ディレクトリに、Runtime.getRuntime().exec() を使用して実行可能ファイルのアクセス許可を設定します。最後のステップは、次のステートメントを使用して Java で実行することでした。

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

2. ffmpeg.c、共有ライブラリ、およびビルドによって生成された「include」フォルダーを jni フォルダーにコピーし、ffmpeg.c の main() 関数をラップする jni 関数を追加しました。このアプローチでは、ndk-build を成功させるために ffmpeg ソースからいくつかのヘッダー ファイルをコピーする必要があることに気付きました。

上記の2つのアプローチはうまくいきませんでした。どこが間違っているのかわからないので、Androidからのmp4ファイルのような単純なffmpegストリーミングを行う方法についての助けをいただければ幸いです。

4

3 に答える 3

3

この質問に答えるのは少し遅いようですが、解決策が必要な場合は、ここに...

さて、私は同じ問題の回避策を考案しましたが、 JNIではなくコンパイル済みのFFmpeg バイナリを使用する最初のアプローチを通じて...

まず、私が思う限りでは、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が必要であり、ここからダウンロードできます。NDKをダウンロードしてディレクトリに抽出する/home/<username>か、必要に応じてスクリプトをカスタマイズします...

またfile://、コマンドラインでプロトコルを使用するのを避け、入力ファイルの絶対パスを指定するだけです。stdoutそして、そのおよびストリームのインスタンスを取得して、FFmpeg プロセスからの出力をログに記録してみてくださいstderr...

于 2013-03-08T15:21:45.757 に答える
3

apporach 2を使用して動作させました。これが私がしたことです。1. ffmpeg.c、「include」フォルダー、および共有ライブラリーをプロジェクトの jni フォルダーにコピーしました。

  1. このブログ投稿を参照して ffmpeg.c を変更しましたhttp://demo860.blogspot.com/2010/07/android-ffmpeg-dynamic-module-jni.html

  2. ndk でのビルド中にいくつかのエラーが発生したため、最終的にビルドが成功するまで、不足している依存関係を追加しました。

最初はアプリが起動し、すぐに終了します。これは、いくつかのことを忘れていたためです。時間と脱毛を節約するために、次のことを行っていることを確認してください。ファイルが SD カードにある場合は、外部ストレージの書き込み許可を設定し、SD カードがマウントされていることを確認してください) - リモート ffserver が実行され、正しく構成されていることを確認してください。デスクトップからストリーミングすることで確認できます-正しいパラメーターが渡されていることを確認してください

これで、sdcard の mp4 ファイルからリモートの ffserver にストリーミングできるようになりました。デバイスのカメラからのストリーミングはまだ試していません。

于 2013-02-08T08:00:39.987 に答える
0

共有ライブラリをコピーしてフォルダーを含める必要はありません。代わりに、Andriod.mk の「PREBUILD_SHARED_LIBRARY」機能を使用できます。

于 2013-02-26T23:22:33.130 に答える