当前位置:首页 » 安卓系统 » android解码库

android解码库

发布时间: 2022-07-31 09:47:39

1. 在Android系统中如何调用系统自带的视频解码器

对需要用FF解码的视频类型去掉内部解码勾选
2.在外部解码器中对所选视频选择FF解码器即可

2. 如何在 android 设备上使用 pjsip G.729 编解码的功能

第一步是生成 pjsip 为 Android (步骤为 Ubuntu linux) 的源代码:


  1. 设置 ANDROID_NDK_ROOT 环境变量设置为您 NDK 根文件夹

  2. 2.转到 pjsip 2.x 文件夹并创建 pjlib/include/pj/config_site.h 包括 config_site_sample.h ( #include <pj/config_site_sample.h> )

  3. 3.运行./configure-android

  4. 4.运行make clean make depend make

  5. 之后这些步骤,你将有几个静态库中的几个文件夹。我建议将它们分组相同的文件夹 (最好在您的项目中) 中的:

mkdir <your_project_path>/pjsip_libs

find . -name *.a | xargs -I % cp % <your_project_path>/pjsip_libs/

一旦你的所有库,您需要将这些库添加到您的项目 Android.mk 文件,这是由包括一个新的模块节每个图书馆。此模块部分应该是一样的东西:


include $(CLEAR_VARS)

LOCAL_MODULE := pjsua-arm-unknown-linux-androideabi

LOCAL_SRC_FILES := $(MY_PJLIB_PATH)/libpjsua-arm-unknown-linux-androideabi.a

include $(PREBUILT_STATIC_LIBRARY)

,你其实是一节中构建您的 JNI 项目的源代码,所有模块都添加到您的静态库的引用:


LOCAL_STATIC_LIBRARIES := pjsua-arm-unknown-linux-androideabi

这将包括 pjsip 的引用加入您的 JNI 库。现在,您需要配置 pjsip UA 实例。


你有一个关于 init 和开始的解释 pjsip 的 UA (pjsua) 在 pjsip/include/pjsua-lib/pjsua.h 但要遵循的主要步骤是:


  1. 创建一个具有 UA 实例pjsua_create

  2. 2.创建一个工作线程与pj_thread_create

  3. 3.UA 实例的设置的默认配置:

pjsua_config cfg 桩 ;pjsua_logging_config log_cfg ;pjsua_media_config media_cfg ;


pj_cli_cfg_default(app_config.cli_cfg.cfg) ;pjsua_logging_config_default(log_cfg) ;pjsua_media_config_default(media_cfg) ;


4.初始化堆栈与pjsua_init


5.启动与堆栈pjsua_start

从这里,你有充足的配置选项 (日志、 媒体、 交通工具等)


您可以找到基本 PJSIP 教程在这里,和里面 pjsip 的源的根路径,你有一个基本 (但不够完整,基本的 SIP 使用情况) 在:pjsip-apps/src/samples/simple_pjsua.c


编辑:在生成时在 pjsip 应用程序的 android 项目,你可以面临一个问题,因为 pjsua app 不生成默认情况下,对一般生成 (更具体地说,pjsua: 目标不包括所有上: 在 pjsip-应用程序/生成/生成文件的目标)。若要修复这只是转到 pjsip-应用程序/创建和运行:


使 pjsua


这将创建在正确的对象文件: pjsip-apps/build/output/pjsua-arm-unknown-linux-androideabi/ (需要构建 android 样本时)。


一旦你所有相应的对象文件,您可以在 pjsip-应用程序/src/pjsua/android 系统再次运行 ndk 生成

3. 怎样用AACLib V1.0在Android上音频编码解码

这几天在 android上的音频项目,顺便把用到的aac编解码库封装了一下,有需要的可以从上面下载。当然是没有本事自己写编解码器的,还是用FFmpeg + FDK_aac来做。下面介绍一下其java接口的使用。java库见libaac.jar文件,把libaac.jar加到 libs目录下,把libaac.so加到 libs/armeabi目录即可使用。

AAC编码:
(1) 创建一个Encoder对象作为成员变量
aac.Encoder encoder;

(2) 初始化它

encoder = new aac.Encoder();
if(! encoder.open(11025, 1))
{
Log.d("mylog", "failed to open encoder !\n");
encoder = null;
}

这里要指定输入音频源(PCM格式)的sampe_rate和channel个数,如果为CHANNEL_OUT_MONO,则channel=1,否则为2。 sample_rate一般设置为11025,因为手机性能有限,设置太高的话也处理不过来,而且处理人声的话11025也是足够了。


(3) 编码

把接收到PCM数据交给encoder来处理即可,要求输入源为ENCODING_PCM_16BIT,即每个sample是16BIT的。这个encoder对象内有2个缓冲区:inbuf, outbuf。显然,在编码时,inbuf就是用于存储接收到的PCM数据,outbuf就是存编码后得到的数据。

int out_size = encoder.encode(in_size);
其返回值out_size,表示在outbuf里的有效数据长度。此时可以把outbuf里的aac数据通过网络发送或其他用途。

其中,用户需要知道encoder每次处理多长的数据,即一个frame的大小。对于单声道MONO来说,每次应该输入2048byte的数据。对于双声道STEREO来说,应该输入4096byte的数据。下面这一行可以根据声道数来计算输入的frame的大小:

int in_size = aac.Encoder.frameSize(1);

AAC解码:
(1) 创建一个Decoder对象作为成员变量

aac.Decoder decoder;

(2) 初始化

decoder = new aac.Decoder();
if( ! decoder.open())
{
Log.d("mylog", "failed to open decoder !\n");
decoder = null;
}

(3) 解码
Decoder对象也有inbuf和outbuf,把待解码的aac frame放到inbuf里

int pcm_size = decoder.decode(aac_size);

解得到数据在outbuf里,其有效长度为上述函数的返回值pcm_size,此时可以把outbuf里的PCM数据取出来播放或其他用途。

4. 有哪些常用或优秀的 Android 第三方类库

Android开发第三方类库分类:

  1. gifview 、 gifview2

    这两个项目是同一人开发的,用于显示gif动画,纯java解码 ,gif图片过大会产生OOM。

  2. android-gif-drawable

    一个也是用于解码显示gif的类库,采用jni解码,大GIF也不会产生oom,完美运行。

  3. PhotoView

    PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。使用比较简单,提供了一个名为PhotoView的控件,可以直接像普通ImageView那样使用。

    特性:支持单点/多点触摸,即时缩放图片;支持平滑滚动;在滑动父控件下能够运行良好;(例如:ViewPager)

不同的环境使用不同的类库,不同的系统也是同样的道理。

5. 在Android开发中有哪些支持无损音频的第三方音频解码器可以使用

Android开发第三方类库分类:gifview、gifview2这两个项目是同一人开发的,用于显示gif动画,纯java解码,gif图片过大会产生OOM。android-gif-drawable一个也是用于解码显示gif的类库,采用jni解码,大GIF也不会产生oom,完美运行。PhotoViewPhotoView是一款扩展自AndroidImageView,支持通过单点/多点触摸来进行图片缩放的智能控件。使用比较简单,提供了一个名为PhotoView的控件,可以直接像普通ImageView那样使用。特性:支持单点/多点触摸,即时缩放图片;支持平滑滚动;在滑动父控件下能够运行良好;(例如:ViewPager)不同的环境使用不同的类库,不同的系统也是同样的道理。

6. android如何使用fdk-aac编码库来把aac转成pcm

线性PCM就是WAV。
AAC-LC是AAC的一个规格,你下载到或者转换的这些高码率的AAC都是AAC-LC的。
扩展名是.m4a。

.aac 是aac的音频数据流,m4a是aac的一个封装方式。其内容本身是一样的。
我用s754,和e453功能是一样的。m4a和wav的我都放了,没问题,只是.aac的我还没试过。
但我相信lz没有.aac的。。因为这年头你下载到的或者转换出来的都是m4a的

7. android使用mediacodec进行编解码 常用吗

应该还是比较常用的。示例如下:

privatefinalStringTAG="MediaCodeSample";
/**用来解码*/
privateMediaCodecmMediaCodec;
/**用来读取音频文件*/
;
privateMediaFormatformat;
privateStringmime=null;
privateintsampleRate=0,channels=0,bitrate=0;
privatelongpresentationTimeUs=0,ration=0;
publicvoiddecode(Stringurl)
{

extractor=newMediaExtractor();
//根据路径获取源文件
try
{
extractor.setDataSource(url);
}catch(Exceptione)
{
Log.e(TAG,"设置文件路径错误"+e.getMessage());
}
try
{
//音频文件信息
format=extractor.getTrackFormat(0);
mime=format.getString(MediaFormat.KEY_MIME);
sampleRate=format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
//声道个数:单声道或双声道
channels=format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
//ifrationis0,
ration=format.getLong(MediaFormat.KEY_DURATION);
//System.out.println("歌曲总时间秒:"+ration/1000000);
bitrate=format.getInteger(MediaFormat.KEY_BIT_RATE);
}catch(Exceptione)
{
Log.e(TAG,"音频文件信息读取出错:"+e.getMessage());
//不要退出,下面进行判断
}
Log.d(TAG,"Trackinfo:mime:"+mime+"采样率sampleRate:"+sampleRate+"channels:"+channels+"bitrate:"
+bitrate+"ration:"+ration);
//检查是否为音频文件
if(format==null||!mime.startsWith("audio/"))
{
Log.e(TAG,"不是音频文件end!");
return;
}
//实例化一个指定类型的解码器,提供数据输出
//
mMediaCodec=MediaCodec.createDecoderByType(mime);

if(mMediaCodec==null)
{
Log.e(TAG,"创建解码器失败!");
return;
}
mMediaCodec.configure(format,null,null,0);

mMediaCodec.start();
//用来存放目标文件的数据
ByteBuffer[]inputBuffers=mMediaCodec.getInputBuffers();
//解码后的数据
ByteBuffer[]outputBuffers=mMediaCodec.getOutputBuffers();
//设置声道类型:AudioFormat.CHANNEL_OUT_MONO单声道,AudioFormat.CHANNEL_OUT_STEREO双声道
intchannelConfiguration=channels==1?AudioFormat.CHANNEL_OUT_MONO:AudioFormat.CHANNEL_OUT_STEREO;
Log.i(TAG,"channelConfiguration="+channelConfiguration);
extractor.selectTrack(0);
//==========开始解码=============
booleansawInputEOS=false;
booleansawOutputEOS=false;
finallongkTimeOutUs=10;
MediaCodec.BufferInfoinfo=newMediaCodec.BufferInfo();
while(!sawOutputEOS)
{
try
{
if(!sawInputEOS)
{
intinputBufIndex=mMediaCodec.dequeueInputBuffer(kTimeOutUs);
if(inputBufIndex>=0)
{
ByteBufferdstBuf=inputBuffers[inputBufIndex];

intsampleSize=extractor.readSampleData(dstBuf,0);
if(sampleSize<0)
{
Log.d(TAG,"sawinputEOS.Stoppingplayback");
sawInputEOS=true;
sampleSize=0;
}else
{
presentationTimeUs=extractor.getSampleTime();
}

mMediaCodec.queueInputBuffer(inputBufIndex,0,sampleSize,presentationTimeUs,
sawInputEOS?MediaCodec.BUFFER_FLAG_END_OF_STREAM:0);

if(!sawInputEOS)
{
extractor.advance();
}

}else
{
Log.e(TAG,"inputBufIndex"+inputBufIndex);
}
}//!sawInputEOS

//
intres=mMediaCodec.dequeueOutputBuffer(info,kTimeOutUs);

if(res>=0)
{
intoutputBufIndex=res;
ByteBufferbuf=outputBuffers[outputBufIndex];
finalbyte[]chunk=newbyte[info.size];
buf.get(chunk);
buf.clear();
if(chunk.length>0)
{

//chunk解码后的音频流
//TODO:处理...
}
mMediaCodec.releaseOutputBuffer(outputBufIndex,false);
if((info.flags&MediaCodec.BUFFER_FLAG_END_OF_STREAM)!=0)
{
Log.d(TAG,"sawoutputEOS.");
sawOutputEOS=true;
}

}elseif(res==MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED)
{
outputBuffers=mMediaCodec.getOutputBuffers();
Log.w(TAG,"[AudioDecoder]outputbuffershavechanged.");
}elseif(res==MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)
{
MediaFormatoformat=mMediaCodec.getOutputFormat();
Log.w(TAG,"[AudioDecoder]outputformathaschangedto"+oformat);
}else
{
Log.w(TAG,"[AudioDecoder]dequeueOutputBufferreturned"+res);
}

}catch(RuntimeExceptione)
{
Log.e(TAG,"[decodeMP3]error:"+e.getMessage());
}
}
//=================================================================================
if(mMediaCodec!=null)
{
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec=null;
}
if(extractor!=null)
{
extractor.release();
extractor=null;
}
//clearsourceandtheotherglobals
ration=0;
mime=null;
sampleRate=0;
channels=0;
bitrate=0;
presentationTimeUs=0;
ration=0;
}

8. 如何在Android用FFmpeg+SDL2.0解码声音

一、创建一个VideoPicture结构体用来保存解码出来的图像;
二、添加数据队列的初始化、添加以及读取的函数;
三、audio_decode_frame():解码音频;
四、audio_callback(): 回调函数,向SDL缓冲区填充数据;
五、创建视频刷新相关的函数;
六、添加视频显示函数;
七、分配显示输出内存空间;
八、解码线程,将解码器,建立音频线,保存重要信息到数据结构中;
九、编写Main函数用来调用解码线程。
知识点延伸:
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行。
SDL2.0(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。SDL内置了调用OpenGL的函数。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

9. android下视频文件从解码到播放需要哪几步,请简述

Android通过软解码播放视频
1, 一般情况下Android的平台都是硬解码视频的,尤其是在Arm平台这种成熟的硬件平台上面(硬解码代码由芯片厂商提供)。但是Android移植到
2, MIPS平台时间还不长,还不成熟,还需要自己实现硬件解码的工作。为了早日让Android在MIPS平台运行起来,我选择了先用软解码播放视频。
3,Android代码是从Android on MIPS社区获得的代码。发现软解码视频播放过程中会发生崩溃。经过分析好像是内存分配的问题。

4, 经过研究OpenCore库(Android框架是通过OpenCore来播放视频的,网上有很多关于OpenCore的介绍,这里就不多说了),并参考Android平台——Surfaceflinger机制。发现问题出在源文件:
frameworks/base/libs/surfaceflinger/LayerBuffer.cpp的LayerBuffer::BufferSource::postBuffer方法中:
............
buffer = new LayerBuffer::Buffer(buffers, offset);
............类LayerBuffer::Buffer的构造函数代码如下:
LayerBuffer::Buffer::Buffer(const ISurface::BufferHeap& buffers, ssize_t offset)
: mBufferHeap(buffers)
{
NativeBuffer& src(mNativeBuffer);
g.handle = 0;
gralloc_mole_t const * mole = LayerBuffer::getGrallocMole();
if (mole && mole->perform) {
int err = mole->perform(mole,
GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER,
buffers.heap->heapID(), buffers.heap->getSize(),
offset, buffers.heap->base(),
& g.handle);
if (err == NO_ERROR) {
op.l = 0;
op.t = 0;
op.r = buffers.w;
op.b = buffers.h;
g.w = buffers.hor_stride ?: buffers.w;
g.h = r_stride ?: buffers.h;
rmat = rmat;
se = (void*)(intptr_t(buffers.heap->base()) + offset);
}
}
}LayerBuffer::getGrallocMole方法的调用到的Gralloc为:
hardware/libhardware/moles/gralloc/gralloc.cpp因为的没有实现在自己的硬件只能用通用的Gralloc,经过分析发现通用的Gralloc没有实现
5, mole->perform函数指针,mole->perform为NULL,所以不会对Buffer进行必要的初始化(我觉得应该是一个疏忽,只是不知道是谷歌的疏忽,还是MIPS移植人员的疏忽,最起码应该能够让通用硬件能跑起来)。参考其他的硬件实现一个perform函数指针到通用Gralloc中。
在源文件:
hardware/libhardware/moles/gralloc/mapper.cpp增加如下的函数定义:
int gralloc_perform(struct gralloc_mole_t const* mole,
int operation, ... )
{
int res = -EINVAL;
va_list args;
va_start(args, operation);
switch (operation) {
case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER: {
int fd = va_arg(args, int);
size_t size = va_arg(args, size_t);
size_t offset = va_arg(args, size_t);
void* base = va_arg(args, void*);
native_handle_t** handle = va_arg(args, native_handle_t**);
private_handle_t* hnd = (private_handle_t*)native_handle_create(
private_handle_t::sNumFds, private_handle_t::sNumInts);
hnd->magic = private_handle_t::sMagic;
hnd->fd = fd;
hnd->flags = private_handle_t::PRIV_FLAGS_USES_PMEM;
hnd->size = size;
hnd->offset = offset;
hnd->base = intptr_t(base) + offset;
hnd->lockState = private_handle_t::LOCK_STATE_MAPPED;
*handle = (native_handle_t *)hnd;
res = 0;
break;
}
}
va_end(args);
return res;
}然后在gralloc.cpp中增加,gralloc_perform的声明:
extern int gralloc_perform(struct gralloc_mole_t const* mole,
int operation, ... );并修改HAL_MODULE_INFO_SYM的定义,增加perform字段的定义:
struct private_mole_t HAL_MODULE_INFO_SYM = {
base: {
.......
perform: gralloc_perform,
},
......
}; 重新编译gralloc模块,再次用Gallary应用程序通过软解码播放视频,就可以流畅的播放了,软解码的效率挺高的,没有卡的感觉!

10. android ffmpeg 解码前需要编码吗

近弄了下android ffmpeg解码,下面把流程总结一下方便大家参考
1.ffmpeg移植
网上有一些关于ffmpeg移植的文章,试了很多次但是最后生成的libffmpeg.so就只有几KB所以这里换一种方式,网上也有文章说到了,其实我觉得这种方式反而要好一点,只需要生成一个库就行了。
我修改好的ffmpeg下载地址:http://download.csdn.net/detail/hcly/6865961
下载后,解压进入ffmpeg-1.2.4-android目录,里面有一个mkconfig.sh文件,打开这个文件,你需要修改几个地方.
mkconfig.sh内容如下:

[python] view plain
#!/bin/sh
export PREBUILT=//work/tools/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3
export PLATFORM=//work/tools/android-ndk-r5b/platforms/android-9/arch-arm
export TMPDIR=//tmp

./configure \
--target-os=linux \
--arch=arm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-avfilter \
--disable-postproc \
--disable-swresample \
--disable-avresample \
--disable-symver \
--disable-debug \
--disable-stripping \
--disable-yasm \
--disable-asm \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-doc \
--enable-static \
--disable-shared \
--enable-cross-compile \
--prefix=//_install \
--cc=$PREBUILT/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/prebuilt/linux-x86/bin/arm-linux-androideabi- \
--nm=$PREBUILT/prebuilt/linux-x86/bin/arm-linux-androideabi-nm \
--extra-cflags="-fPIC -DANDROID -I$PLATFORM/usr/include" \
--extra-ldflags="-L$PLATFORM/usr/lib -nostdlib"

sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i 's/HAVE_CBRTF 0/HAVE_CBRTF 1/g' config.h
sed -i 's/HAVE_ISINF 0/HAVE_ISINF 1/g' config.h
sed -i 's/HAVE_ISNAN 0/HAVE_ISNAN 1/g' config.h
sed -i 's/HAVE_SINF 0/HAVE_SINF 1/g' config.h
sed -i 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
sed -i 's/#define av_restrict restrict/#define av_restrict/g' config.h
最开始的环境变量要设置一下:

[python] view plain
export PREBUILT=//work/tools/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3
export PLATFORM=//work/tools/android-ndk-r5b/platforms/android-9/arch-arm
export TMPDIR=//tmp
这个为你的NDK的路径,以及临时目录

还有一个地方需要修改:

[python] view plain
--prefix=//_install \
这个为安装目录,请改成你自己的。

然后执行./mkconfig.sh
应该会有一个警告,不用管。直接执行make几分钟左右应该就会编译完成了,然后执行make install
在你的安装目录下就会生成两个目录include和llib到这里 我们移植就完成了,先把这些文件放在这,后面我们需要用到。
2.jni的编写
在你的android工程目录下新建一个jni的目录(其实我是在另一个工程里新建的,前面我试了一次执行ndk-build的时候把工程里的东西给删除了),把前面我们安装的include整个目录拷贝到jni目录下,把lib目录里的所有.a文件拷贝到jni目录下,新建Android.mk文件,内容如下:

[java] view plain
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := libavformat.a
LOCAL_CFLAGS :=-Ilibavformat
LOCAL_EXPORT_C_INCLUDES := libavformat
LOCAL_EXPORT_CFLAGS := -Ilibavformat
LOCAL_EXPORT_LDLIBS := -llog
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := libavcodec.a
LOCAL_CFLAGS :=-Ilibavcodec
LOCAL_EXPORT_C_INCLUDES := libavcodec
LOCAL_EXPORT_CFLAGS := -Ilibavcodec
LOCAL_EXPORT_LDLIBS := -llog
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := libavutil.a
LOCAL_CFLAGS :=-Ilibavutil
LOCAL_EXPORT_C_INCLUDES := libavutil
LOCAL_EXPORT_CFLAGS := -Ilibavutil
LOCAL_EXPORT_LDLIBS := -llog
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES :=libswscale.a
LOCAL_CFLAGS :=-Ilibavutil -Ilibswscale
LOCAL_EXPORT_C_INCLUDES := libswscale
LOCAL_EXPORT_CFLAGS := -Ilibswscale
LOCAL_EXPORT_LDLIBS := -llog -lavutil
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpegutils
LOCAL_SRC_FILES := native.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS := -L$(LOCAL_PATH) -lm -lz
LOCAL_STATIC_LIBRARIES := avformat avcodec avutil swscale
include $(BUILD_SHARED_LIBRARY)
新建native.c文件,这个是我们最终要调用到的文件,内容如下:

[java] view plain
/*
* Copyright 2011 - Churn Labs, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
* This is mostly based off of the FFMPEG tutorial:
* http://dranger.com/ffmpeg/
* With a few updates to support Android output mechanisms and to update
* places where the APIs have shifted.
*/

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>

#define LOG_TAG "FFMPEGSample"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

AVCodecContext * pCodecCtx = NULL;
AVFrame * pFrame=NULL;
AVPacket avpkt;
struct SwsContext *swsctx = NULL;
AVFrame * picture=NULL;

JNIEXPORT jint JNICALL Java_com__iclient_FfmpegIF_getffmpegv(JNIEnv * env, jclass obj)
{
LOGI("getffmpegv");
return avformat_version();
}

JNIEXPORT jint JNICALL Java_com__iclient_FfmpegIF_DecodeInit(JNIEnv * env, jclass obj,jint width,jint height)
{
LOGI("Decode_init");

AVCodec * pCodec=NULL;
avcodec_register_all();
//av_register_all();
//avcodec_init();
av_init_packet(&avpkt);
pCodec=avcodec_find_decoder(CODEC_ID_H264);
if(NULL!=pCodec)
{
pCodecCtx=avcodec_alloc_context3(pCodec);
if(avcodec_open2(pCodecCtx,pCodec,NULL)>=0)
{
pCodecCtx->height = height;
pCodecCtx->width = width;

pFrame=avcodec_alloc_frame();
}
return 1;
}
else
return 0;
}

JNIEXPORT jint JNICALL Java_com__iclient_FfmpegIF_Decoding(JNIEnv * env, jclass obj,const jbyteArray pSrcData,const jint DataLen,const jbyteArray pDeData)
{
//LOGI("Decoding");

int frameFinished;
int i,j;
int consumed_bytes;
jbyte * Buf = (jbyte*)(*env)->GetByteArrayElements(env, pSrcData, 0);
jbyte * Pixel= (jbyte*)(*env)->GetByteArrayElements(env, pDeData, 0);

avpkt.data = Buf;

热点内容
安卓模拟大自然怎么玩 发布:2025-01-20 22:46:55 浏览:361
科密加密卡片 发布:2025-01-20 22:45:01 浏览:111
苹果的文件怎么转到安卓 发布:2025-01-20 22:43:10 浏览:652
c语言回文串 发布:2025-01-20 22:43:09 浏览:767
垃圾压缩价格 发布:2025-01-20 22:14:05 浏览:421
温十系统如何看处理器配置 发布:2025-01-20 21:59:47 浏览:302
米号源码 发布:2025-01-20 21:55:30 浏览:893
电信四川dns服务器ip 发布:2025-01-20 21:54:51 浏览:92
电脑弹出脚本错误还能继续使用吗 发布:2025-01-20 21:42:29 浏览:586
安卓私密照片在哪里 发布:2025-01-20 21:41:05 浏览:5