導航:首頁 > 操作系統 > android攝像頭ffmpeg

android攝像頭ffmpeg

發布時間:2022-05-20 21:50:44

1. android studio中怎麼調用ffmpeg庫

整體調用邏輯為:
1 編譯完ffmpeg庫
2 使用jni方式撰寫c代碼,其中需要包含相應的ffmpeg的頭文件
3 撰寫相應的Android.mk文件,裡面指定需要編譯的c代碼以及需要鏈接的動態庫
4 執行ndk-build生成相應的jni庫
5 創建andorid java程序,代碼中loadLibrary相應ffmpeg庫以及剛才生成的jni庫
6 靜態方法聲明native函數,這些函數在jni寫的c語言中都已經實現過

2. Android 中實時獲取戶外監控攝像頭的視頻信息怎麼做

Android中實時獲取戶外監控攝像頭的視頻信息的方法為:
1、使用FFMpeg進行視頻採集,使用Live555進行RTP傳輸,使用VideoView進行播放。
csdn提到:重載FrameSource,寫一個服務類,可以從FrameSource的派生類讀取幀數據,轉發給live555.
評價:本方案大型訪問量大的不行,少量連接比如100以內的可以。
2、用gstreamer完成採集、編碼、組播。客戶端使用VideoView進行播放。
評價:本方案優點為可以實現大訪問量。缺點是基本從底層架構,代碼量比較大。
3、使用FFmpeg進行視頻採集,使用ffserver進行視頻轉發,客戶端使用VideoView播放。
評價:優點是實現簡單、容易演示,缺點是實時性不好以及用戶量大不行。

3. 如何在Android上集成ffmpeg

下面把具體編譯步驟描述如下,假定NDK安裝在~/android-ndk-r7:
1. 首先從FFmpeg官網下載最新的release版本源碼ffmpeg-0.11.tar.gz解壓縮到Android源碼樹的ffmpeg/下。
2 准備一個編譯腳本build_android.sh並放在ffmpeg/下面,這個腳本也是Rockplayer提供的,需做一些修改,其內容附在後面。我目前用的也會附在後面。
3 在ffmpeg目錄下運行./build_android.sh開始編譯FFmpeg,編譯好的libffmpeg.so會放在文件夾android裡面,一共有3個版本分別對應3種ARM體系結構,包括armv7-a、armv7-a-vfp、armv6_vfp,根據所運行的硬體平台選取其中一個版本。為了編譯使用FFmpeg的程序時可以方便地找到libffmpeg.so,可將它復制到$OUT/system/lib/和$OUT/obj/lib/,當然這一步也可以加在build_android.sh中做。
4. 接下來就是編譯可執行文件ffmpeg了,這個工具可以在命令行下完成FFmpeg提供的幾乎所有功能包括編碼、解碼、轉碼等,也是用來調試和驗證很有用的工具。其實上述編譯完後在$ANDROID_BUILD_TOP/external/ffmpeg/下也會生成ffmpeg,但是在設備上無法運行。為了編出能在設備上運行的ffmpeg,可以寫一個簡單的Android.mk,

4. 如何在Android用FFmpeg解碼圖像

fetch code
用git把ffmpeg(我用的github上FFmpeg-Android)和x264(vlc的官方git)分別都clone下來。
build x264
在x264目錄裡面寫一個myconfig.sh(其實直接把這些命令打在終端也行,問題是有的時候需要改來改去,不如寫個文件改起來方便)
export NDK=/opt/android-ndk
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt
export PLATFORM=$NDK/platforms/android-14/arch-arm
export PREFIX=/home/mingkai/softwares/x264
./configure \
--enable-pic \
--enable-static \
--enable-shared \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix="/opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-"
\
--sysroot=$PLATFORM \
--prefix=$PREFIX
其中prefix貌似直接用"arm-linux-androideabi-「也可以。
然後可以make和make install了。(記得改PREFIX等環境變數)
build FFmpeg
這個是從github上FFmpeg-Android裡面的FFmpeg-Android.sh裡面改了改一些參數。
最主要的是FFMPEG_FLAGS,裡面都是一些關於FFmpeg的參數設定,尤其是是否啟用encoder/decoder之類的。
還有一點就是再下面EXTRA_CFLAGS裡面加上
「-I/path/to/x264/include」
EXTRA_LDFLAGS裡面加上
「-L/path/to/x264/lib -lx264」。

5. android ffmpeg 是啥意思

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。
用來開發音視頻的~!

6. android 攝像頭出來的格式怎麼會是yuv420p 而不是yuv420sp(nv21)呢

那是因為你在相機參數初始化的時候未設置,加上這個就可以了

List<Integer> formatsList = parameters.getSupportedPreviewFormats(); //獲取設備支持的預覽format
if(formatsList.contains(ImageFormat.NV21))
parameters.setPreviewFormat(ImageFormat.NV21); //設置預覽格式為NV21,默認為NV21
if(formatsList.contains(ImageFormat.JPEG))
parameters.setPictureFormat(ImageFormat.JPEG); //設置照片儲存格式

7. 如何使用ffmpeg 進行攝像頭錄像

我用的命令是 ffmpeg -f video4linux -s 320*240 -r 10 -i /dev/video0 test.asf 運行的結果是 FFmpeg version SVN-r16967, Copyright (c) 2000-2009 Fabrice Bellard, et al. configuration: --enable-pthreads --enable-x11grab --enable-mema...如有疑問追問,如滿意記得採納,
如果有其他問題也可點我名字向我求助
答題不易,
如果沒有回答完全,請您諒解,

請採納最快回答的正確答案!!謝謝!

8. Android上的實時視頻監控怎麼實現的

1、使用FFMpeg進行視頻採集,使用Live555進行RTP傳輸,使用VideoView進行播放。
csdn提到:重載FrameSource,寫一個服務類,可以從FrameSource的派生類讀取幀數據,轉發給live555.
評價:本方案大型訪問量大的不行,少量連接比如100以內的可以。
2、用gstreamer完成採集、編碼、組播。客戶端使用VideoView進行播放。
評價:本方案優點為可以實現大訪問量。缺點是基本從底層架構,代碼量比較大。
3、使用FFmpeg進行視頻採集,使用ffserver進行視頻轉發,客戶端使用VideoView播放。
評價:優點是實現簡單、容易演示,缺點是實時性不好以及用戶量大不行。

9. 如何在Android用FFmpeg解碼圖像

創建一個VideoPicture結構體用來保存解碼出來的圖像。

LOCAL_PATH := $(call my-dir)
###########################
#
# SDL shared library
#
###########################
include $(CLEAR_VARS)
LOCAL_MODULE := SDL2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_SRC_FILES := \
$(subst $(LOCAL_PATH)/,, \
$(wildcard $(LOCAL_PATH)/src/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/audio/mmy/*.c) \
$(LOCAL_PATH)/src/atomic/SDL_atomic.c \
$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \
$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \
$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \
$(wildcard $(LOCAL_PATH)/src/events/*.c) \
$(wildcard $(LOCAL_PATH)/src/file/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \
$(wildcard $(LOCAL_PATH)/src/haptic/mmy/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/*.c) \
$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \
$(wildcard $(LOCAL_PATH)/src/power/*.c) \
$(wildcard $(LOCAL_PATH)/src/power/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/filesystem/mmy/*.c) \
$(wildcard $(LOCAL_PATH)/src/render/*.c) \
$(wildcard $(LOCAL_PATH)/src/render/*/*.c) \
$(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/*.c) \
$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/*.c) \
$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/*.c) \
$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \
$(wildcard $(LOCAL_PATH)/src/test/*.c))
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
include $(BUILD_SHARED_LIBRARY)
###########################
#
# SDL static library
#
###########################
#LOCAL_MODULE := SDL2_static
#LOCAL_MODULE_FILENAME := libSDL2
#LOCAL_SRC_FILES += $(LOCAL_PATH)/src/main/android/SDL_android_main.c
#LOCAL_LDLIBS :=
#LOCAL_EXPORT_LDLIBS := -Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit -ldl -lGLESv1_CM -lGLESv2 -llog -landroid
#include $(BUILD_STATIC_LIBRARY)

二、參考[原]如何在Android用FFmpeg解碼圖像, 在工程中新建一個ffmpeg文件夾,將與ffmpeg相關的頭文件include進來。ffmpeg文件夾下的Android.mk內容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := /path/to/build/ffmpeg/libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

三、新建player文件夾,用來編寫解碼與顯示文件。player.c文件內容:

/*
* SDL_Lesson.c
*
* Created on: Aug 12, 2014
* Author: clarck
*/
#include <jni.h>
#include <android/native_window_jni.h>
#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_events.h"
#include "../include/logger.h"
#include "../ffmpeg/include/libavcodec/avcodec.h"
#include "../ffmpeg/include/libavformat/avformat.h"
#include "../ffmpeg/include/libavutil/pixfmt.h"
#include "../ffmpeg/include/libswscale/swscale.h"
int main(int argc, char *argv[]) {
char *file_path = argv[1];
LOGI("file_path:%s", file_path);
AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrame, *pFrameYUV;
AVPacket *packet;
uint8_t *out_buffer;
SDL_Texture *bmp = NULL;
SDL_Window *screen = NULL;
SDL_Rect rect;
SDL_Event event;
static struct SwsContext *img_convert_ctx;
int videoStream, i, numBytes;
int ret, got_picture;
av_register_all();
pFormatCtx = avformat_alloc_context();
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
LOGE("Could not initialize SDL - %s. \n", SDL_GetError());
exit(1);
}
if (avformat_open_input(&pFormatCtx, file_path, NULL, NULL) != 0) {
LOGE("can't open the file. \n");
return -1;
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
LOGE("Could't find stream infomation.\n");
return -1;
}
videoStream = 1;
for (i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videoStream = i;
}
}
LOGI("videoStream:%d", videoStream);
if (videoStream == -1) {
LOGE("Didn't find a video stream.\n");
return -1;
}
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (pCodec == NULL) {
LOGE("Codec not found.\n");
return -1;
}
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
LOGE("Could not open codec.\n");
return -1;
}
pFrame = av_frame_alloc();
pFrameYUV = av_frame_alloc();
//---------------------------init sdl---------------------------//
screen = SDL_CreateWindow("My Player Window", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, pCodecCtx->width, pCodecCtx->height,
SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL);
SDL_Renderer *renderer = SDL_CreateRenderer(screen, -1, 0);
bmp = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_YV12,
SDL_TEXTUREACCESS_STREAMING, pCodecCtx->width, pCodecCtx->height);
//-------------------------------------------------------------//

img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
numBytes = avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width,
pCodecCtx->height);
out_buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
avpicture_fill((AVPicture *) pFrameYUV, out_buffer, AV_PIX_FMT_YUV420P,
pCodecCtx->width, pCodecCtx->height);
rect.x = 0;
rect.y = 0;
rect.w = pCodecCtx->width;
rect.h = pCodecCtx->height;
int y_size = pCodecCtx->width * pCodecCtx->height;
packet = (AVPacket *) malloc(sizeof(AVPacket));
av_new_packet(packet, y_size);
av_mp_format(pFormatCtx, 0, file_path, 0);
while (av_read_frame(pFormatCtx, packet) >= 0) {
if (packet->stream_index == videoStream) {
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,
packet);
if (ret < 0) {
LOGE("decode error.\n");
return -1;
}
LOGI("got_picture:%d", got_picture);
if (got_picture) {
sws_scale(img_convert_ctx,
(uint8_t const * const *) pFrame->data,
pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data,
pFrameYUV->linesize);
////iPitch 計算yuv一行數據占的位元組數
SDL_UpdateTexture(bmp, &rect, pFrameYUV->data[0], pFrameYUV->linesize[0]);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, bmp, &rect, &rect);
SDL_RenderPresent(renderer);
}
SDL_Delay(50);
}
av_free_packet(packet);
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
SDL_Quit();
exit(0);
break;
default:
break;
}

10. 有沒有ffmpeg 開發的android demo求一例

轉載 首先:

是要編譯libjnivideo.so和libjniaudio.so 這兩個so因為不同的版本或者修改過的framework是不一樣的,所以需要在android源碼中 編譯出自己的so。我的android 2.1源碼是從官網下載回來的,沒有經過修改。

下載鏈接中的native目錄下的源碼到framework/base目錄下具體看他的目錄結構。https://github:com/havlenapetr/android_frameworks_base編譯主要有3個錯誤

1.

library 'libjnigraphics.so' not in prelink map

當前目錄下的Android.mk 加上

LOCAL_PRELINK_MODULE := false2.

frameworks/base/native/video/jni/surface.cpp:17:36: error: surfaceflinger/Surface.h: No such file or directory

修改頭文件

#include <android/surface.h>

#include <ui/Surface.h>

#include <utils/Log.h>

#include <SkBitmap.h>

#include <SkCanvas.h>3.

make: *** 沒有規則可以創建「out/target/proct/generic/obj/SHARED_LIBRARIES/libjnivideo_intermediates/LINKED/libjnivideo.so」需要的目標「out/target/proct/generic/obj/lib/libsurfaceflinger_client.so」。 停止。

當前目錄下的Android.mk

LOCAL_SHARED_LIBRARIES := /

libskia /

libui /

libutils /

liblog

到這里如果幸運的話可以編譯出so。其次是編譯libffmpeg_jni.so

需要修改的地方:

1.

jni/jni/Android.mkLOCAL_C_INCLUDES += /

$(LOCAL_PATH)/../libffmpeg /

$(LOCAL_PATH)/../libmediaplayer /

$(LOCAL_PATH)/../include /

$(LOCAL_PATH)/../include/androidifeq ($(IN_NDK),true)

LOCAL_LDLIBS := -llog

else

LOCAL_PRELINK_MODULE := false

LOCAL_LDLIBS := -llog

LOCAL_SHARED_LIBRARIES := liblog

endif

2.

Vector.h#include <new>

#include <stdint.h>

#include <sys/types.h>#include <cutils/log.h>

#include <utils/VectorImpl.h>

#include <utils/TypeHelpers.h>

#include <android/Errors.h>

3.

<utils/TypeHelpers.h>4

VectorImpl.h#include <assert.h>

#include <stdint.h>

#include <sys/types.h>

#include <android/Errors.h>5.

VectorImpl.cpp

#include <string.h>

#include <stdlib.h>

#include <stdio.h>#include <cutils/log.h>

#include <android/Errors.h>

#include <utils/SharedBuffer.h>

#include <utils/VectorImpl.h>

同時也要把剛才兩個編譯出來的so放到obj/local/armeabi目錄下,之後就可以了編譯出libffmpeg_jni.so.

最後也要把剛才兩個so放到libs/armeabi目錄下。要不然運行的時候找不到。

播放的時候太卡了,聲音也沒有同步。

閱讀全文

與android攝像頭ffmpeg相關的資料

熱點內容
雲伺服器建設原理 瀏覽:256
javajunit4for 瀏覽:843
華為伺服器如何進陣列卡配置 瀏覽:433
apache伺服器ip地址訪問 瀏覽:718
如何買到安卓手機預裝軟體 瀏覽:537
冤罪百度雲不要壓縮 瀏覽:85
蘇州雲存儲伺服器 瀏覽:173
解壓收納原聲 瀏覽:384
java注冊驗證 瀏覽:374
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:835
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:904