- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一款 Android 应用。要继续,我必须将 libav 与 Android NDK 一起使用。我正在使用此脚本为 arm、armv7、x86 和 mips 编译 libav 的静态库:
#!/bin/sh
message () {
echo "=========================================="
echo "== $1"
echo "=========================================="
}
NDK=~/Documents/adt-bundle/ndk-r9
PROGDIR=`dirname $0`
PROGDIR=`cd $PROGDIR && pwd`
LIBAV=$PROGDIR/src/libav-9.9.tar.gz
for ABI in armeabi armeabi-v7a x86 mips; do
case $ABI in
armeabi)
TOOLCHAIN=arm-linux-androideabi-4.8
TOOLCHAIN_DIR=$PROGDIR/toolchains/android-9-arm
TOOLCHAIN_PREFIX=arm-linux-androideabi-
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
armeabi-v7a)
TOOLCHAIN=arm-linux-androideabi-4.8
TOOLCHAIN_DIR=$PROGDIR/toolchains/android-9-arm
TOOLCHAIN_PREFIX=arm-linux-androideabi-
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"
;;
x86)
TOOLCHAIN=x86-4.8
TOOLCHAIN_DIR=$PROGDIR/toolchains/android-9-x86
TOOLCHAIN_PREFIX=i686-linux-android-
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
mips)
TOOLCHAIN=mipsel-linux-android-4.8
TOOLCHAIN_DIR=$PROGDIR/toolchains/android-9-mips
TOOLCHAIN_PREFIX=mipsel-linux-android-
EXTRA_CFLAGS=""
EXTRA_LDFLAGS=""
;;
esac
if [ ! -d $TOOLCHAIN_DIR ] ; then
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$TOOLCHAIN_DIR --toolchain=$TOOLCHAIN
fi
BUILDDIR="$PROGDIR/build/$ABI"
INCDIR="$PROGDIR/include/$ABI"
LIBDIR="$PROGDIR/lib/$ABI"
LIBAV_DIR="$BUILDDIR/libav-9.9"
LIBAV_BUILD_DIR="$LIBAV_DIR-build"
if [ ! -d $LIBAV_DIR ] ; then
mkdir -p $LIBAV_DIR
tar -xf $LIBAV -C `dirname $LIBAV_DIR`
fi
export PATH="$TOOLCHAIN_DIR/bin:$PATH"
export SYSROOT="$TOOLCHAIN_DIR/sysroot"
export CC="${TOOLCHAIN_PREFIX}gcc"
# export CXX="${TOOLCHAIN_PREFIX}g++"
# export LD="${TOOLCHAIN_PREFIX}ld"
# export AR="${TOOLCHAIN_PREFIX}ar"
export CFLAGS="-O3 $EXTRA_CFLAGS"
export LDFLAGS="-static $EXTRA_LDFLAGS"
(message "Configuring libav for Android $ABI" \
&& cd $LIBAV_DIR \
&& sh ./configure \
--prefix=$LIBAV_BUILD_DIR \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN_PREFIX \
--sysroot=$SYSROOT \
--target-os=linux \
--extra-cflags="$CFLAGS" \
--extra-ldflags="$LDFLAGS" \
--arch="$ABI" \
--disable-pthreads \
--disable-programs \
--disable-doc \
--disable-avdevice \
--disable-avformat \
--disable-avfilter \
--disable-avresample \
--disable-network \
--disable-everything \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
\
&& message "Making libav for Android ($ABI)" \
&& make \
\
&& message "Installing libav for Android ($ABI)" \
&& make install \
&& mkdir -pv $INCDIR $LIBDIR \
&& mkdir -pv $INCDIR/libavcodec \
&& cp -pv $LIBAV_BUILD_DIR/include/libavcodec/*.h $INCDIR/libavcodec \
&& cp -pv $LIBAV_BUILD_DIR/lib/libavcodec.a $LIBDIR \
&& mkdir -pv $INCDIR/libavutil \
&& cp -pv $LIBAV_BUILD_DIR/include/libavutil/*.h $INCDIR/libavutil \
&& cp -pv $LIBAV_BUILD_DIR/lib/libavutil.a $LIBDIR \
&& mkdir -pv $INCDIR/libswscale \
&& cp -pv $LIBAV_BUILD_DIR/include/libswscale/*.h $INCDIR/libswscale \
&& cp -pv $LIBAV_BUILD_DIR/lib/libswscale.a $LIBDIR) || exit 1
done
编译效果不错。我得到了为 4 种架构编译的 libavcodec、libavutil 和 libswscale。
当将这些库与我的 x86 架构项目链接时,我的问题就来了(它适用于 arm 和 mips!)。以下是 ndk-build all -k
命令的输出:
Compile++ thumb : stream <= jni.cpp
Compile++ thumb : stream <= parser.cpp
Compile++ thumb : stream <= stream.cpp
Compile++ thumb : stream <= surface.cpp
Compile++ thumb : stream <= thread.cpp
Compile++ thumb : stream <= decoder.cpp
Compile++ thumb : stream <= utils.cpp
StaticLibrary : libstdc++.a
SharedLibrary : libstream.so
Install : libstream.so => libs/armeabi-v7a/libstream.so
Compile++ thumb : stream <= jni.cpp
Compile++ thumb : stream <= parser.cpp
Compile++ thumb : stream <= stream.cpp
Compile++ thumb : stream <= surface.cpp
Compile++ thumb : stream <= thread.cpp
Compile++ thumb : stream <= decoder.cpp
Compile++ thumb : stream <= utils.cpp
StaticLibrary : libstdc++.a
SharedLibrary : libstream.so
Install : libstream.so => libs/armeabi/libstream.so
Compile++ x86 : stream <= jni.cpp
Compile++ x86 : stream <= parser.cpp
Compile++ x86 : stream <= stream.cpp
Compile++ x86 : stream <= surface.cpp
Compile++ x86 : stream <= thread.cpp
Compile++ x86 : stream <= decoder.cpp
Compile++ x86 : stream <= utils.cpp
StaticLibrary : libstdc++.a
SharedLibrary : libstream.so
/home/camtrace/Documents/adt-bundle/ndk-r9/toolchains/x86-4.6/prebuilt/linux-x86/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: internal error in relocate_section, at /s/ndk-toolchain/src/build/../binutils/binutils-2.21/gold/i386.cc:2980
collect2: ld returned 1 exit status
make: *** [obj/local/x86/libstream.so] Error 1
Compile++ mips : stream <= jni.cpp
Compile++ mips : stream <= parser.cpp
Compile++ mips : stream <= stream.cpp
Compile++ mips : stream <= surface.cpp
Compile++ mips : stream <= thread.cpp
Compile++ mips : stream <= decoder.cpp
Compile++ mips : stream <= utils.cpp
StaticLibrary : libstdc++.a
SharedLibrary : libstream.so
Install : libstream.so => libs/mips/libstream.so
make: Target `all' not remade because of errors.
这是我的 Android.mk 文件:
LOCAL_PATH := $(call my-dir)
#
# Libjpeg-turbo
include $(CLEAR_VARS)
LOCAL_MODULE := turbojpeg
LOCAL_SRC_FILES := prebuilts/lib/$(TARGET_ARCH_ABI)/libturbojpeg.a
LOCAL_EXPORT_C_INCLUDES := jni/prebuilts/include/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
#
# Libav
include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := prebuilts/lib/$(TARGET_ARCH_ABI)/libavcodec.a
LOCAL_EXPORT_C_INCLUDES := jni/prebuilts/include/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_SRC_FILES := prebuilts/lib/$(TARGET_ARCH_ABI)/libavutil.a
LOCAL_EXPORT_C_INCLUDES := jni/prebuilts/include/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_SRC_FILES := prebuilts/lib/$(TARGET_ARCH_ABI)/libswscale.a
LOCAL_EXPORT_C_INCLUDES := jni/prebuilts/include/$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
#
# My code
include $(CLEAR_VARS)
LOCAL_MODULE := stream
LOCAL_SRC_FILES := \
src/jni.cpp \
src/parser.cpp \
src/stream.cpp \
src/surface.cpp \
src/thread.cpp \
src/decoder.cpp \
src/utils.cpp
LOCAL_STATIC_LIBRARIES := turbojpeg libavcodec libavutil libswscale
LOCAL_CFLAGS := -Wall -Werror
LOCAL_LDLIBS := -landroid -llog
include $(BUILD_SHARED_LIBRARY)
最佳答案
我能够使用此处的构建脚本成功为 Android 构建 ffmpeg 库 http://code.google.com/p/dolphin-player/source/checkout .然后他们与我的应用程序正常链接。
关于android - 将 libav 链接到我的 Android NDK 项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18918535/
来自Linux背景。我只是想知道在 OSX 上安装 avprobe 的最佳方法是什么? 我尝试安装 libav:http://libav.org/download.html但这似乎使用了avconf。
如何在FFmpeg C API中编码之前为帧计算正确的PTS值? 为了进行编码,我使用了avcodec_encode_video2函数,然后通过av_interleaved_write_frame编写
使用 libav 保存视频中的帧。 问题是,如果你多次调用 decode 函数,然后调用 2nd,然后就没有正确处理。 第一次这样的结论(一切正常): [swscaler @ 0x8b48510]No
我正在尝试制作一个简单的 av 播放器,在某些情况下,我可以正确获取如下值: checking /media/timecapsule/Music/02 Baawre.mp3 [mp3 @ 0x7f06
我在OS X Mavericks上没有安装libav的运气。我已经尝试了一切。 我正在遵循此指南:http://earthwithsun.com/questions/568464/install-la
尝试使用 ffmpeg 打开网络摄像头(ffplay -f video4linux2/dev/video0 有效 pFormatCtx = NULL; av_register_all(
我使用下面的命令来转换文件 ./avconv -i inputFile -vcodec libx264 -trellis 2 -crf 23 -tune psnr -vf Crop='trunc(iw
我试图通过使用代码将 MP2 文件转换为原始 PCM 来获得与 ffmpeg/avconv 相同的输出。我使用了 the tutorial included in the FFmpeg/Libav d
我正在关注 ffmpeg 文档中的音频编码示例:https://www.ffmpeg.org/doxygen/0.6/api-example_8c-source.html 但我想解码 .wav 文件,
我正在尝试使用 libav(ffmpeg) 创建带有 MJPEG 视频负载的 RTP 流示例代码非常简单,适用于 MPEG1我看到 MJPEG 中的编码有效,但是当我需要发送 mjpeg 时帧 RTP
有没有办法使用 libav/avconv 来复制 FFMPEG 中瓦片过滤器的效果? 我正在尝试为每十秒的视频输入创建一个从左到右的图像 strip 。 我的计划是首先生成图像,然后创建图像条。最好我
我正在尝试使用 libav 在我的应用程序中删除视频的某些部分,例如在长度为 00:08:00 的视频中,我尝试删除帧 100-250 和 400-500(仅作为示例)。 我写了这段代码来复制 AVP
我有一个能够同时生成 5 个 mpeg 传输流的程序。每个流都有自己的上下文,并在独立的线程中完成。当只有一个流处于事件状态时,一切都很好。一旦我激活另一个流,我的帧速率就会大大下降。两个流仍然可以正
我有一系列编码数据包、H.264 视频和 AAC 音频。当它们出现时,我正在使用 av_write_frame 将它们写入视频文件。 连续给定以下情况 10秒视频,然后 10 秒的视频和音频,然后 1
我看到了这个答案,Libav (ffmpeg) copying decoded video timestamps to encoder 但我仍然不明白为什么我们需要流时基和编解码器时基。目前我正在尝试
我正在尝试学习使用 libav。我遵循了 dranger.com 上的第一个教程,但有一次我有点困惑。 // Write pixel data for(y=0; ydata[0]+y*pFrame->
我有一个从我的手机以纵向模式拍摄的视频。以下是有关视频的转储信息: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.MOV': Metadata: maj
我有一个带有卡住(热)像素的视频,我想修复它,比如说用相邻像素的平均值替换像素。我在 Ubuntu 上,所以我想使用 libav/ffmpeg,但我真的不知道该怎么做。谁能提供一个简单的解决方案? 最
这个问题在这里已经有了答案: FFMPEG (libx264) "height not divisible by 2" (7 个回答) 5年前关闭。 我需要批量处理一堆视频以将它们的高度缩放到 240
我目前正在使用 libav 将视频的音频流提取到原始 PCM 文件中。 此代码适用于 mp3,但当我尝试使用 mp4 视频时,Audacity 上导入的原始格式显示奇怪的 0 到 -1 之间的规则下降
我是一名优秀的程序员,十分优秀!