1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/anjoiner-FFmpegCommand

Клонировать/Скачать
FFmpeg4.2.2-Build.md 9.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 15:26 9d95b64

Сборка FFmpeg с помощью NDK-build

  1. Отредактируйте файл configure в ffmpeg-4.2.2, заменив:
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)'
  1. Создайте файл build_android.sh в папке ffmpeg-4.2.2 и отредактируйте его:
#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径.
NDK=/home/anjoiner/Android/Sdk/ndk-bundle
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
API=21

function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --prefix=$PREFIX \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-symver \
    --enable-nonfree \
    --enable-gpl \
    --enable-small \
    --enable-neon \
    --enable-hwaccels \
    --enable-avdevice \
    --enable-postproc \
    --enable-shared \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --nm=$NM \
    --strip=$STRIP \
    --cc=$CC \
    --cxx=$CXX \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#armv8-a
ARCH=aarch64-linux-android-
VERSION=arm64
CPU=armv8-a
CROSS_PREFIX=$TOOLCHAIN/bin/${ARCH}
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
NM=$TOOLCHAIN/bin/${ARCH}nm
STRIP=$TOOLCHAIN/bin/${ARCH}strip
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

#armv7-a
ARCH=arm-linux-androideabi-
VERSION=arm
CPU=armv7-a
CROSS_PREFIX=$TOOLCHAIN/bin/${ARCH}
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
NM=$TOOLCHAIN/bin/${ARCH}nm
STRIP=$TOOLCHAIN/bin/${ARCH}strip
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -march=$CPU"
build_android
  1. Дайте файлу build_android.sh права на выполнение:

sudo chmod +x build_android.sh 4. Запустите сборку:

./build_android.sh 5. Затем вы можете получить результат:

и

6. Создайте каталог jni в любом месте и скопируйте все каталоги из ffmeg-4.2.2/android/armv7-a/include в jni:

7. Создайте каталог prebuilt в jni и скопируйте все файлы xxx.so из ffmpeg-4.2.2/android/armv7-a/lib в prebuilt:

8. Скопируйте следующие файлы из ffmpeg-4.2.2/fftools в jni:

  • cmdutils.c
  • cmdutils.h
  • ffmpeg_filter.c
  • ffmpeg_hw.c
  • ffmpeg_opt.c
  • ffmpeg.c
  • ffmpeg.h
  1. Скопируйте следующий файл config.h из ffmpeg-4.2.2 в jni.
  2. Отредактируйте ffmpeg.c:
  • измените int main(int argc, char **argv) на int run(int argc, char **argv);
  • добавьте следующий код перед return:
nb_filtergraphs = 0;
nb_output_files = 0;
nb_output_streams = 0;
nb_input_files = 0;
nb_input_streams = 0;
  1. Скройте функцию exit_program:
int run(int argc, char **argv)
{
    int i, ret;
    BenchmarkTimeStamps ti;

    init_dynload();

    register_exit(ffmpeg_cleanup);

    setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */

    av_log_set_flags(AV_LOG_SKIP_REPEATED);
    parse_loglevel(argc, argv, options);

    if(argc>1 && !strcmp(argv[1], "-d")){
        run_as_daemon=1;
        av_log_set_callback(log_callback_null);
        argc--;
        argv++;
    }

#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avformat_network_init();

    show_banner(argc, argv, options);

    /* parse options and open all input/output files */
``` **Текст запроса:**

ret = ffmpeg_parse_options(argc, argv); if (ret < 0); // exit_program(1);

if (nb_output_files <= 0 && nb_input_files == 0) {
    show_usage();
    av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
    // exit_program(1);
}

/* file converter / grab */
if (nb_output_files <= 0) {
    av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
    // exit_program(1);
}

for (i = 0; i < nb_output_files; i++) {
    if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
        want_sdp = 0;
}

current_time = ti = get_benchmark_time_stamps();
if (transcode() < 0);
    // exit_program(1);
if (do_benchmark) {
    int64_t utime, stime, rtime;
    current_time = get_benchmark_time_stamps();
    utime = current_time.user_usec - ti.user_usec;
    stime = current_time.sys_usec  - ti.sys_usec;
    rtime = current_time.real_usec - ti.real_usec;
    av_log(NULL, AV_LOG_INFO,
           "bench: utime=%0.3fs stime=%0.3fs rtime=%0.3fs\n",
           utime / 1000000.0, stime / 1000000.0, rtime / 1000000.0);
}
av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
       decode_error_stat[0], decode_error_stat[1]);
if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1]);
    // exit_program(69);

// exit_program(received_nb_signals ? 255 : main_return_code);

nb_filtergraphs = 0;
nb_output_files = 0;
nb_output_streams = 0;
nb_input_files = 0;
nb_input_streams = 0;
return main_return_code;

}


**Перевод текста на русский язык:**

ret = ffmpeg_parse_options (argc, argv); if (ret < 0): # exit_program (1);

if (nb_output_files ≤ 0 и nb_input_files == 0): show_usage (); av_log (NULL, AV_LOG_WARNING, «Используйте -h для получения полной справки или, ещё лучше, запустите 'man %s' \n», program_name); # exit_program (1);

/* file converter / grab */ if (nb_output_files ≤ 0): av_log (NULL, AV_LOG_FATAL, «Должен быть указан хотя бы один выходной файл\n»); # exit_program (1);

for (i = 0; i < nb_output_files; i++): if (strcmp (output_files [i] -> ctx -> oformat -> name, «rtp»)): want_sdp = 0;

current_time = ti = get_benchmark_time_stamps (); if (transcode () < 0): # exit_program (1); if (do_benchmark): int64_t utime, stime, rtime; current_time = get_benchmark_time_stamps (); utime = current_time .user_usec — ti .user_usec; stime = current_time .sys_usec — ti .sys_usec; rtime = current_time .real_usec — ti .real_usec; av_log (NULL, AV_LOG_INFO, «bench: utime =% 0 .3 fs stime =% 0 .3 fs rtime =% 0 .3 fs \ n», utime / 1000000 .0, stime / 1000000 .0, rtime / 1000000 .0);

av_log (NULL, AV_LOG_DEBUG, «% PRIu64 кадров успешно декодировано, % PRIu64 ошибок декодирования \ n», decode_error_stat [0], decode_error_stat [1]); if ((decode_error_stat [0] + decode_error_stat [1]) * max_error_rate < decode_error_stat [1]): # exit_program (69);

exit_program (получено_nb_сигналов? 255: main_return_code);

nb_filtergraphs = 0; nb_output_files = 0; nb_output_streams = 0; nb_input_files = 0; nb_input_streams = 0; return main_return_code;


LOCAL_SRC_FILES := prebuilt/libavfilter.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libpostproc
LOCAL_SRC_FILES := prebuilt/libpostproc.so
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-invoke

LOCAL_SRC_FILES :=ffmpeg-invoke.cpp \
                 cmdutils.c \
                 ffmpeg_filter.c \
                 ffmpeg_opt.c \
                 ffmpeg_hw.c \
                 ffmpeg.c

# change path of ffmpeg
LOCAL_C_INCLUDES := /home/anjoiner/Coder/FFmpegCommand/ffmpeg-4.2.2

LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid -lm -pthread -L$(SYSROOT)/usr/lib
LOCAL_SHARED_LIBRARIES := libavdevice libavcodec libavfilter libavformat libavutil libswresample libswscale libpostproc

include $(BUILD_SHARED_LIBRARY)

17. Создайте `Application.mk` в `jni`.

APP_ABI := armeabi-v7a APP_PLATFORM := android-21 APP_OPTIM := release APP_STL := c++_static


18. Выполните команду `ndk-build` в папке `jni`. 

```/home/anjoiner/Android/Sdk/ndk-bundle/ndk-build```

19. Если возникают следующие ошибки:

```/home/anjoiner/Coder/FFmpegCommand/ffmpeg-build2/jni/cmdutils.h:640:39: error: 
      invalid suffix on literal; C++11 requires a space between literal and
      identifier [-Wreserved-user-defined-literal]
    snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);

Отредактируйте файл cmdutils.h:

замените

snprintf(name, sizeof(name), "0x%" PRIx64, ch_layout); на snprintf(name, sizeof(name), "0x%" PRIx64, ch_layout);

  1. Снова выполните команду ndk-build в папке jni.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/anjoiner-FFmpegCommand.git
git@api.gitlife.ru:oschina-mirror/anjoiner-FFmpegCommand.git
oschina-mirror
anjoiner-FFmpegCommand
anjoiner-FFmpegCommand
master