android UVC h264 ffmpeg硬解码(RK3288 android5.1)

需求:由于软解码速度跟不上导致解码花屏严重,转用ffmpeg交叉编译android 5.1源码硬解码

 

假设已经编译好RK3288 android5.1系统(主要是硬编码用到的libstagefright库)

系统编译参考:https://blog.csdn.net/pizziars/article/details/83176742

 

修改ffmpeg-2.2/configure文件

如果直接按照未修改的配置进行编译,结果编译出来的so文件类似libavcodec.so.55.39.101,版本号位于so之后,Android上似乎无法加载。因此需要按如下修改:

将该文件中的如下四行:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替换为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

 

另外(硬编码相关,否则提示 ERROR: libstagefright_h264 not found):

enabled libstagefright_h264  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static

修改为

enabled libstagefright  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static

 

编写config_android.sh脚本文件

config_android.sh的内容如下:

#!/bin/bash
export NDK=/home/username/ffmpeg/android-ndk-r9d
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

#git clone --depth=1 --branch gingerbread-release https://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
#git clone --depth=1 --branch gingerbread-release https://github.com/CyanogenMod/android_system_core.git ../android-source/system/core

# Libraries from any froyo/gingerbread device/emulator should work
# fine, since the symbols used should be available on most of them.
#if [ ! -d "../android-libs" ]; then
#    if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
#        wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
#    fi
#    unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../
#    mv ../system/lib ../android-libs
#    rmdir ../system
#fi

function build_one
{
./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --enable-libstagefright-h264 \
    --disable-doc \
    --disable-ffserver \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS $EXTRA_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \
    --extra-cxxflags="$EXTRA_CXXFLAGS" \
     $ADDITIONAL_CONFIGURE_FLAG
}

ANDROID_SOURCE=/home/username/rk
ANDROID_LIBS=/home/username/rk/out/target/product/rk3288_box/system/lib
ABI="armeabi-v7a"

EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"

EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -lstagefright  -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared"

#EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -#lstagefright  -lstdc++ -lutils -lbinder"

EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"

CPU=armeabi-v7a
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
#make clean
#make -j6 || exit 1


 

给config_android.sh增加可执行权限:

$chmod +x config_android.sh

执行config_android.sh

$./config_android.sh

 

修改刚刚生成的文件config.h

#define HAVE_LOG2 1
#define HAVE_LOG2F 1
#define HAVE_POSIX_MEMALIGN 1

修改为

#define HAVE_LOG2 0
#define HAVE_LOG2F 0
#define HAVE_POSIX_MEMALIGN 0

 

修改文件/libavcodec/libstagefright.cpp(注释掉#include <media/stagefright/MediaDebug.h>):
//#include <media/stagefright/MediaDebug.h>

 

编译:

make -j6

 

至此编译完成

 

参考资料:

https://blog.csdn.net/gobitan/article/details/22750719 

https://blog.csdn.net/lidecoolblue/article/details/17240813

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android UVCAndroid系统上的USB视频类(UVC)设备驱动程序。UVC设备是指插入电脑、手机等设备的摄像头、麦克风、扬声器等外界音频/视频设备,通常通过USB口连接。UVC设备在传输音频视频等数据的过程中,不需要安装驱动程序,只需要插上即可自动识别。此外,Android UVC驱动程序的出现,也使得Android设备可以兼容更多不同品牌的外部音频视频设备,如微型相机、USB摄像头、红外摄像头等。 Android UVC对开发者来说也是很有帮助的。例如,应用程序可以直接访问摄像头的输出,而无需使用专用SDK;还可以通过USB设备连接到外部音频设备,并利用该设备处理应用程序的音频数据;甚至Android UVC还可以为开发者提供将设备作为HDMI输出器或虚拟USB主机的选择,以便在开发特定类型的产品时进行高级调试。 在使用Android UVC的同时,需要考虑的问题也不少。由于UVC设备的独特性,需要特定的USB接口支持才能正常工作。Android UVC还存在锁定、崩溃和数据质量等问题,因此需要谨慎使用。总之,Android UVC驱动程序丰富了Android系统设备与外部媒体设备的互联互通,以及应用程序在Android设备上的开发效率。 ### 回答2: Android UVC是指在Android系统上支持USB Video Class(UVC)设备的功能。UVC是一种视频设备接口标准,可以将外部USB摄像头、微型视频摄像机、望远镜和显微镜等设备与计算机连接,通过USB接口实现与计算机的数据传输。 在Android系统上使用UVC设备可以让用户轻松地进行视频录制、视频会议、远程监控和医疗诊断等应用。UVC设备通过USB接口连接到Android设备上,可以无需安装额外的驱动程序或软件,直接在Android设备上进行视频采集和处理。通过Android UVC功能,消费者可以更方便地使用外部视频设备与Android设备集成,增强设备的多媒体能力,扩展使用场景。 此外,一些Android设备已经支持内置UVC设备,如GoPro等相机,用户可以通过USB接口直接将视频数据导入到Android设备中,实现视频编辑和分享。Android UVC的普及和应用,将进一步加强Android设备的视频处理能力,为用户带来更加便捷和高效的视频交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值