FFmpeg开发指南
来自SylixOS-wiki
(版本间的差异)
Jiaojinxing (讨论 | 贡献) (→编译) |
Jiaojinxing (讨论 | 贡献) (→修改 FFmpeg 代码) |
||
(未显示1个用户的51个中间版本) | |||
第1行: | 第1行: | ||
− | ==下载 | + | ==下载 FFmpeg== |
− | :在 linux 环境下操作。 | + | :在 linux 或 MinGW 环境下操作。 |
− | :进入 sylixos 工作空间: | + | :*1. 进入 sylixos 工作空间: |
cd /home/user/sylixos_workspace | cd /home/user/sylixos_workspace | ||
− | :下载 | + | :*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 | ||
− | :进入 | + | :*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 |
− | :* | + | :*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 \ | export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \ | ||
− | -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I | + | -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \ |
− | -I | + | -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/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- | + | :::*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 | + | -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \ |
− | -I | + | -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/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 系列处理器环境变量: |
export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \ | export CFLAGS="-mcpu=arm920t -fPIC -DSYLIXOS \ | ||
− | -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I | + | -DSYLIXOS_LIB -fsigned-char -fno-short-enums -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include \ |
− | -I | + | -I$SYLIXOS_BASE_PATH/libsylixos/SylixOS/include/inet -I$SYLIXOS_BASE_PATH/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 | + | --extra-libs='-nostdlib -lcextern -ldsohandle -lstdc++ -lvpmpdm -lm -lgcc' --prefix=/opt/arm-sylixos-ffmpeg |
+ | |||
+ | :'''商业版 ARM 工具链配置''' | ||
− | + | ::*armv7-a 系列处理器配置: | |
− | :*armv7- | + | |
./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 | + | --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- \ | ./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 | + | --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 修改: |
− | : | + | :在文件的末尾增加如下代码: |
− | + | ||
+ | #undef HAVE_IO_H | ||
#define HAVE_IO_H 0 | #define HAVE_IO_H 0 | ||
− | + | ||
− | + | #undef HAVE_FLT_LIM | |
#define HAVE_FLT_LIM 0 | #define HAVE_FLT_LIM 0 | ||
− | + | ||
− | + | #undef HAVE_FORK | |
#define HAVE_FORK 0 | #define HAVE_FORK 0 | ||
− | + | ||
− | + | #undef HAVE_GLOB | |
#define HAVE_GLOB 0 | #define HAVE_GLOB 0 | ||
− | + | ||
− | + | #undef HAVE_MACH_ABSOLUTE_TIME | |
#define HAVE_MACH_ABSOLUTE_TIME 0 | #define HAVE_MACH_ABSOLUTE_TIME 0 | ||
− | + | ||
− | + | #undef HAVE_SYSCTL | |
#define HAVE_SYSCTL 0 | #define HAVE_SYSCTL 0 | ||
− | + | ||
− | + | #undef HAVE_ARC4RANDOM | |
+ | #define HAVE_ARC4RANDOM 0 | ||
+ | |||
+ | /* 增加 closesocket 定义 */ | ||
#define closesocket close | #define closesocket close | ||
− | :2. | + | :*2. ./libavutil/atomic_gcc.h 修改: |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
#ifdef SYLIXOS | #ifdef SYLIXOS | ||
第180行: | 第163行: | ||
#endif | #endif | ||
− | ==编译== | + | ==编译 FFmpeg== |
make | 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(®); 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(®); *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(®); 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(®); 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 里。