欠揍的ffmpeg,调试android里的ffmpeg (1)
2015-06-24 00:00
1121 查看
摘要: ffmpeg是牛,可也真古怪,碰到几个非典型无解问题,例如:对于jpeg的编码为什么不用libjpeg而是用mpeg(没错就是这电影老古董格式)里代码?为什么mjpeg(就是连续的jpeg)编码输出时,编码第N+1副图时才真正的输出第N幅图的jpeg编码结果? ..... 单纯看代码已经不管用,只有调试他了,哪怕是在android里。
目标问题
对于jpeg的编码为什么不用libjpeg而是用mpeg(没错就是这电影老古董格式)里代码?
其实发现就连wmv等等一些平时用不着的破东西,都是和mpeg老古董共用一套代码。jpeg和mpeg没什么关系吧?overhead不大吗?
为什么mjpeg(就是连续的jpeg)编码输出时,编码第N+1副图时才真正的输出第N幅图的jpeg编码结果?
每得到一副原图输入数据,那么内存就似乎被copy到新内存,然后废弃,巨大的图片的时候,这种copy很浪费CPU,如何让他不要copy而是直接用原始内存。反正一幅幅图来也不着急,干嘛要copy 呢。
先编一个android里用的ffmpeg命令行,要debug版的,关键是configure时加上
例如:
从NDK里准备一个标准的gcc tool chain以便后面的跨平台编译。
然后到ffmpeg的源码下执行configure
只是一个例子而已,只留下了rawvideo输入格式和mjpeg输出格式的支持。
然后make, 得到ffmpeg。
传到android的/data/local/tmp/上。
(一些更具体的准备性质的步骤参照Android native debug: 手动使用gdbserver远程调试C代码)
然后,开始启动gdbserver,
待续。
目标问题
对于jpeg的编码为什么不用libjpeg而是用mpeg(没错就是这电影老古董格式)里代码?
其实发现就连wmv等等一些平时用不着的破东西,都是和mpeg老古董共用一套代码。jpeg和mpeg没什么关系吧?overhead不大吗?
为什么mjpeg(就是连续的jpeg)编码输出时,编码第N+1副图时才真正的输出第N幅图的jpeg编码结果?
每得到一副原图输入数据,那么内存就似乎被copy到新内存,然后废弃,巨大的图片的时候,这种copy很浪费CPU,如何让他不要copy而是直接用原始内存。反正一幅幅图来也不着急,干嘛要copy 呢。
先编一个android里用的ffmpeg命令行,要debug版的,关键是configure时加上
--enable-debug --disable-stripping
例如:
从NDK里准备一个标准的gcc tool chain以便后面的跨平台编译。
echo ---------------make standard GCC Tool Chain from Android NDK-------------------- ls -d ./std_toolchain && { echo ./std_toolchain already exist; exit 0; } printenv ANDROID_NDK_ROOT > /dev/null || { echo please export ANDROID_NDK_ROOT=root_dir_of_your_android_ndk; exit 1; } PLATFORM=$(basename $(ls -d $ANDROID_NDK_ROOT/platforms/android-8)); test -z $PLATFORM && exit 1 TOOLCHAIN=$(basename $(ls -d $ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-[4-5].* | tail -n 1)); test -z $TOOLCHAIN && exit 1 WORK_SYSTEM=$(basename $(ls -d $ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-[4-5].*/prebuilt/* | tail -n 1)); test -z $WORK_SYSTEM && exit 1 $ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --install-dir=./std_toolchain --platform=$PLATFORM --toolchain=$TOOLCHAIN --system=$WORK_SYSTEM --arch=arm --verbose echo ""; echo ok; echo "" export PATH="$PWD/std_toolchain/bin:$PATH" export CC=arm-linux-androideabi-gcc
然后到ffmpeg的源码下执行configure
./configure --enable-cross-compile --cross-prefix=arm-linux-androideabi- --target-os=linux \ --arch=armv7 --cpu=armv7-a \ --disable-doc --disable-ffplay --disable-ffprobe --disable-ffserver --disable-symver --enable-debug --disable-stripping --disable-everything \ --enable-static \ --enable-protocol=pipe \ --enable-filter=scale --enable-filter=crop --enable-filter=transpose \ --enable-demuxer=rawvideo --enable-decoder=rawvideo \ --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=mjpeg --enable-encoder=mjpeg
只是一个例子而已,只留下了rawvideo输入格式和mjpeg输出格式的支持。
然后make, 得到ffmpeg。
传到android的/data/local/tmp/上。
(一些更具体的准备性质的步骤参照Android native debug: 手动使用gdbserver远程调试C代码)
然后,开始启动gdbserver,
待续。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories