FFmpeg开发指南

来自SylixOS-wiki
(版本间的差异)
跳转至: 导航, 搜索
(开源版工具链环境变量)
(修改 FFmpeg 代码)
 
(未显示1个用户的49个中间版本)
第1行: 第1行:
  
==下载 ffmpeg==
+
==下载 FFmpeg==
  
:在 linux 环境下操作。
+
:在 linux 或 MinGW 环境下操作。
  
:进入 sylixos 工作空间:
+
:*1. 进入 sylixos 工作空间:
 
  cd /home/user/sylixos_workspace
 
  cd /home/user/sylixos_workspace
  
:下载 ffmpeg:
+
:*2. 下载 FFmpeg:
 
  git config --global core.autocrlf false
 
  git config --global core.autocrlf false
 
  git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
 
  git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
  
:进入 ffmpeg 目录:
+
:*3. 进入 FFmpeg 目录:
 
  cd ffmpeg
 
  cd ffmpeg
  
 
==修改 configure==
 
==修改 configure==
  
:*屏蔽 check_cflags -Wredundant-decls 避免过多报警。
+
:*1. 屏蔽 check_cflags -Wredundant-decls 避免过多报警。
  
:*屏蔽 check_cflags -Wstrict-prototypes 避免过多报警。
+
:*2. 屏蔽 check_cflags -Wstrict-prototypes 避免过多报警。
  
:*修改 if test_ldflags -Wl,--version-script,$TMPV; then 为 if false ; then
+
:*3. 修改 if test_ldflags -Wl,--version-script,$TMPV; then 为 if false ; then
  
:*修改 ln_s="ln -s -f" 为 ln_s="cp -p"  (备注:如果在 windows 下编译,缺少 ln 工具,使用 cp 代替)
+
:*4. 屏蔽 die "C compiler test failed." 跳过编译器测试失败。
 
+
:*屏蔽 die "C compiler test failed." 跳过编译器测试失败。
+
  
 
==增加环境变量==
 
==增加环境变量==
  
===开源版工具链环境变量===
+
:*1. 设置 SylixOS Base 工程路径环境变量(编译好的 SylixOS Base 工程路径根据实际情况设置):
:*armv4系列处理器环境变量:
+
export SYLIXOS_BASE_PATH=/home/user/sylixos_workspace/sylixos-base
 +
 
 +
:*2. 设置链接与编译标志环境变量:
 +
::'''开源版 ARM 工具链环境变量'''
 +
 
 +
:::*armv4 系列处理器环境变量:
 
  export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
 
  export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \
+
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
  -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \
+
  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include"  
-I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include"  
+
 
  export CXXFLAGS=$CFLAGS
 
  export CXXFLAGS=$CFLAGS
  export LDFLAGS="-mcpu=arm920t -fPIC -shared"
+
  export LDFLAGS="-mcpu=arm920t -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
 
  export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
 
  export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
  
===商业版工具链环境变量===
+
::'''商业版 ARM 工具链环境变量'''
  
:*armv7-a系列处理器环境变量:
+
:::*armv7-a 系列处理器环境变量:
  
 
  export CFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -DSYLIXOS \
 
  export CFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -DSYLIXOS \
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \
+
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
  -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \
+
  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include"  
-I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include"  
+
 
  export CXXFLAGS=$CFLAGS
 
  export CXXFLAGS=$CFLAGS
  export LDFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -shared"
+
  export LDFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
 
  export ASFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -x assembler-with-cpp"
 
  export ASFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -x assembler-with-cpp"
  
:*armv4系列处理器环境变量:
+
:::*armv4 系列处理器环境变量:
 
  export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
 
  export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I../libsylixos/SylixOS -I../libsylixos/SylixOS/include \
+
  -DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
  -I../libsylixos/SylixOS/include/inet -I../libsylixos/SylixOS/include/inet/ipv4 \
+
  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include"  
-I../libsylixos/SylixOS/include/inet/ipv6 -I../libcextern/libcextern/include"  
+
 
  export CXXFLAGS=$CFLAGS
 
  export CXXFLAGS=$CFLAGS
  export LDFLAGS="-mcpu=arm920t -fPIC -shared"
+
  export LDFLAGS="-mcpu=arm920t -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
 
  export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
 
  export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
  
==配置==
+
==配置 FFmpeg==
  
===开源版工具链配置===
+
:'''开源版 ARM 工具链配置'''
 +
 
 +
::*armv4 系列处理器配置:
 
  ./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-none-eabi- \
 
  ./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-none-eabi- \
 
  --enable-shared --disable-static --disable-doc \
 
  --enable-shared --disable-static --disable-doc \
  --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
+
  --extra-libs='-nostdlib -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/arm-sylixos-ffmpeg
 +
 
 +
:'''商业版 ARM 工具链配置'''
  
===商业版工具链配置===
+
::*armv7-a 系列处理器配置:
:*armv7-a系列处理器配置:
+
 
  ./configure --arch=armv7-a --cpu=cortex-a8 --target-os=none --cross-prefix=arm-sylixos-eabi- \
 
  ./configure --arch=armv7-a --cpu=cortex-a8 --target-os=none --cross-prefix=arm-sylixos-eabi- \
 
  --enable-shared --disable-static --disable-doc \
 
  --enable-shared --disable-static --disable-doc \
  --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
+
  --extra-libs='-nostdlib -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/armv7a-sylixos-ffmpeg
  
:*armv4系列处理器配置:
+
::*armv4 系列处理器配置:
 
  ./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-sylixos-eabi- \
 
  ./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-sylixos-eabi- \
 
  --enable-shared --disable-static --disable-doc \
 
  --enable-shared --disable-static --disable-doc \
  --extra-libs='-nostdlib -L../libsylixos/Debug -L../libcextern/Debug -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc'
+
  --extra-libs='-nostdlib -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/arm-sylixos-ffmpeg
  
 
:如果出现 bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory 错误,请用 vim 将 configure 的换行符修改为 unix 格式,vim 命令为 :set ff=unix。
 
:如果出现 bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory 错误,请用 vim 将 configure 的换行符修改为 unix 格式,vim 命令为 :set ff=unix。
第81行: 第84行:
 
:将会生成 config.h config.mak doc/config.texi libavutil/avconfig.h 文件。
 
:将会生成 config.h config.mak doc/config.texi libavutil/avconfig.h 文件。
  
==修改代码==
+
==修改 FFmpeg 代码==
  
:1. config.h 修改:
+
:*1. config.h 修改:
  
:将如下的 HAVE_XXX 定义为 0:
+
:在文件的末尾增加如下代码:
  //#define HAVE_IO_H 1
+
 
 +
  #undef HAVE_IO_H
 
  #define HAVE_IO_H 0
 
  #define HAVE_IO_H 0
 
+
  //#define HAVE_FLT_LIM 1
+
  #undef HAVE_FLT_LIM
 
  #define HAVE_FLT_LIM 0
 
  #define HAVE_FLT_LIM 0
 
+
  //#define HAVE_FORK 1
+
  #undef HAVE_FORK
 
  #define HAVE_FORK 0
 
  #define HAVE_FORK 0
 
+
  //#define HAVE_GLOB 1
+
  #undef HAVE_GLOB
 
  #define HAVE_GLOB 0
 
  #define HAVE_GLOB 0
 
+
  //#define HAVE_MACH_ABSOLUTE_TIME 1
+
  #undef HAVE_MACH_ABSOLUTE_TIME
 
  #define HAVE_MACH_ABSOLUTE_TIME 0
 
  #define HAVE_MACH_ABSOLUTE_TIME 0
 
+
  //#define HAVE_SYSCTL 1
+
  #undef HAVE_SYSCTL
 
  #define HAVE_SYSCTL 0
 
  #define HAVE_SYSCTL 0
 
+
:并增加 closesocket 定义:
+
#undef HAVE_ARC4RANDOM
 +
#define HAVE_ARC4RANDOM 0
 +
 +
/* 增加 closesocket 定义 */
 
  #define closesocket close
 
  #define closesocket close
  
:2. h264_parser.c 修改:
+
:*2.  ./libavutil/atomic_gcc.h 修改:
 
+
:在 static void close(...) 前加入:
+
 
+
#ifdef SYLIXOS_LIB
+
#define close h264_close
+
#endif
+
 
+
:3. lxfdec.c 修改:
+
 
+
:在 static int sync(...) 前加入:
+
 
+
#ifdef SYLIXOS_LIB
+
#define sync __sync
+
#endif
+
 
+
:4. rmdec.c 修改:
+
 
+
:在 static int sync(...) 前加入:
+
 
+
#ifdef SYLIXOS_LIB
+
#define sync __sync
+
  #endif
+
 
+
:5. atomic_gcc.h 修改:
+
  
 
  #ifdef SYLIXOS
 
  #ifdef SYLIXOS
第180行: 第163行:
 
  #endif
 
  #endif
  
==编译==
+
==编译 FFmpeg==
  
 
  make
 
  make
  
:这时也可以在 windows 环境下执行 make 编译。
+
==安装 FFmpeg ==
 +
 
 +
:'''安装 FFmpeg 需要在 root 用户下''',输入 su 切换到 root 用户:
 +
 
 +
su
 +
 
 +
:'''再修改环境变量 PATH,不然 make install 的结果会非常庞大(因为找不到 arm-none-eabi-strip)''':
 +
 
 +
export PATH=/usr/lib/gcc-arm-none-eabi/bin:$PATH
 +
 
 +
:输入如下命令以安装 FFmpeg:
 +
 
 +
make install
 +
 +
:会安装到配置时指定的目录 /opt/arm-sylixos-ffmpeg 里。

2016年4月14日 (四) 16:08的最后版本

目录

[编辑] 下载 FFmpeg

在 linux 或 MinGW 环境下操作。
  • 1. 进入 sylixos 工作空间:
cd /home/user/sylixos_workspace
  • 2. 下载 FFmpeg:
git config --global core.autocrlf false
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
  • 3. 进入 FFmpeg 目录:
cd ffmpeg

[编辑] 修改 configure

  • 1. 屏蔽 check_cflags -Wredundant-decls 避免过多报警。
  • 2. 屏蔽 check_cflags -Wstrict-prototypes 避免过多报警。
  • 3. 修改 if test_ldflags -Wl,--version-script,$TMPV; then 为 if false ; then
  • 4. 屏蔽 die "C compiler test failed." 跳过编译器测试失败。

[编辑] 增加环境变量

  • 1. 设置 SylixOS Base 工程路径环境变量(编译好的 SylixOS Base 工程路径根据实际情况设置):
export SYLIXOS_BASE_PATH=/home/user/sylixos_workspace/sylixos-base
  • 2. 设置链接与编译标志环境变量:
开源版 ARM 工具链环境变量
  • armv4 系列处理器环境变量:
export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
-DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
-I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include" 
export CXXFLAGS=$CFLAGS
export LDFLAGS="-mcpu=arm920t -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"
商业版 ARM 工具链环境变量
  • armv7-a 系列处理器环境变量:
export CFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -DSYLIXOS \
-DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
-I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include" 
export CXXFLAGS=$CFLAGS
export LDFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
export ASFLAGS="-march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon -fPIC -x assembler-with-cpp"
  • armv4 系列处理器环境变量:
export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \
-DSYLIXOS_LIB -fsigned-char -fno-short-enums  -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \
-I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/libcextern/libcextern/include" 
export CXXFLAGS=$CFLAGS
export LDFLAGS="-mcpu=arm920t -fPIC -shared -L$SYLIXOS_BASE_PATH/libsylixos/Debug -L$SYLIXOS_BASE_PATH/libcextern/Debug"
export ASFLAGS="-mcpu=arm920t -fPIC -x assembler-with-cpp"

[编辑] 配置 FFmpeg

开源版 ARM 工具链配置
  • armv4 系列处理器配置:
./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-none-eabi- \
--enable-shared --disable-static --disable-doc \
--extra-libs='-nostdlib -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/arm-sylixos-ffmpeg
商业版 ARM 工具链配置
  • armv7-a 系列处理器配置:
./configure --arch=armv7-a --cpu=cortex-a8 --target-os=none --cross-prefix=arm-sylixos-eabi- \
--enable-shared --disable-static --disable-doc \
--extra-libs='-nostdlib -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/armv7a-sylixos-ffmpeg
  • armv4 系列处理器配置:
./configure --arch=armv4 --cpu=arm920t --target-os=none --cross-prefix=arm-sylixos-eabi- \
--enable-shared --disable-static --disable-doc \
--extra-libs='-nostdlib -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/arm-sylixos-ffmpeg
如果出现 bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory 错误,请用 vim 将 configure 的换行符修改为 unix 格式,vim 命令为 :set ff=unix。
将会生成 config.h config.mak doc/config.texi libavutil/avconfig.h 文件。

[编辑] 修改 FFmpeg 代码

  • 1. config.h 修改:
在文件的末尾增加如下代码:
#undef HAVE_IO_H
#define HAVE_IO_H 0

#undef HAVE_FLT_LIM
#define HAVE_FLT_LIM 0

#undef HAVE_FORK
#define HAVE_FORK 0

#undef HAVE_GLOB
#define HAVE_GLOB 0

#undef HAVE_MACH_ABSOLUTE_TIME
#define HAVE_MACH_ABSOLUTE_TIME 0

#undef HAVE_SYSCTL
#define HAVE_SYSCTL 0

#undef HAVE_ARC4RANDOM
#define HAVE_ARC4RANDOM 0

/* 增加 closesocket 定义 */
#define closesocket close
  • 2. ./libavutil/atomic_gcc.h 修改:
#ifdef SYLIXOS
#define avpriv_atomic_int_get atomic_int_get_gcc
static inline int atomic_int_get_gcc(volatile int *ptr)
{
    INTREG reg;
    int val;
    API_AtomicLock(&reg);
    val = *ptr;
    API_AtomicUnlock(reg);
    return val;
}
#define avpriv_atomic_int_set atomic_int_set_gcc
static inline void atomic_int_set_gcc(volatile int *ptr, int val)
{
    INTREG reg;
    API_AtomicLock(&reg);
    *ptr = val;
    API_AtomicUnlock(reg);
}
#define avpriv_atomic_int_add_and_fetch atomic_int_add_and_fetch_gcc
static inline int atomic_int_add_and_fetch_gcc(volatile int *ptr, int inc)
{
    INTREG  reg;
    int val; 
    API_AtomicLock(&reg);
    val = *ptr = *ptr + inc;
    API_AtomicUnlock(reg);
    return val;
}
#define avpriv_atomic_ptr_cas atomic_ptr_cas_gcc
static inline void *atomic_ptr_cas_gcc(void * volatile *ptr,
                                       void *oldval, void *newval)
{
    INTREG  reg;
    void *val; 
    API_AtomicLock(&reg);
    val = *ptr;
    if (val == oldval) {
        *ptr = newval;
    }
    API_AtomicUnlock(reg);
    return val;
}
#else
    原有的函数定义,略。
#endif

[编辑] 编译 FFmpeg

make

[编辑] 安装 FFmpeg

安装 FFmpeg 需要在 root 用户下,输入 su 切换到 root 用户:
su
再修改环境变量 PATH,不然 make install 的结果会非常庞大(因为找不到 arm-none-eabi-strip)
export PATH=/usr/lib/gcc-arm-none-eabi/bin:$PATH
输入如下命令以安装 FFmpeg:
make install
会安装到配置时指定的目录 /opt/arm-sylixos-ffmpeg 里。
个人工具
名字空间

变种
操作
导航
工具