Android 音视频编解码

合集下载

Android测试中的音视频功能测试技巧

Android测试中的音视频功能测试技巧

Android测试中的音视频功能测试技巧随着智能手机的普及和应用程序的多样化,音视频功能在Android设备上的应用越来越广泛。

为了确保应用程序的稳定性和良好的用户体验,开发者需要进行全面的音视频功能测试。

本文将介绍一些在Android测试中常用的音视频功能测试技巧,帮助测试人员更好地进行测试工作。

一、测试环境准备在进行音视频功能测试之前,首先需要准备一个合适的测试环境。

测试环境应包括适当的硬件设备、Android操作系统版本、网络环境等。

确保硬件设备能够满足音视频功能的要求,操作系统版本与目标用户群体的普遍使用情况相匹配,网络环境能够模拟不同网络条件下的使用情况。

二、基本功能测试音视频功能的基本测试主要涵盖以下几个方面:1.音视频播放:测试音频和视频的播放功能是否正常,包括播放、暂停、停止等操作。

2.音视频录制:测试音频和视频的录制功能是否正常,包括开始录制、停止录制、保存录制文件等操作。

3.音视频格式兼容性:测试音频和视频的兼容性,确保应用程序支持的音视频格式与目标用户常用的格式相匹配。

4.音视频流畅度:测试音频和视频的播放是否流畅,包括卡顿、延迟等情况。

三、声音测试在Android设备上进行音频测试时,需要关注以下几个方面:1.音量测试:测试音频的音量调节功能,包括最大音量和最小音量的测试。

2.音频输出测试:测试音频通过不同输出设备(如扬声器、耳机)播放时的效果差异。

3.音频输入测试:测试音频通过不同输入设备(如麦克风、蓝牙耳机)录制时的效果差异。

四、视频测试在Android设备上进行视频测试时,需要关注以下几个方面:1.视频分辨率测试:测试不同分辨率的视频在设备上的播放效果,包括清晰度、流畅度等。

2.视频编解码测试:测试不同编解码算法对视频质量的影响,确保应用程序能够正常解码和播放各种视频格式。

3.视频播放控制测试:测试视频播放时的控制功能,包括快进、倒退、截屏等操作。

五、网络测试音视频功能在网络环境下的表现十分重要,因此需要进行以下测试:1.网络延迟测试:测试在不同网络条件下(如2G、3G、4G、Wi-Fi)音视频的延迟情况。

android多媒体框架

android多媒体框架

Android多媒体框架Android是目前全球使用最广泛的移动操作系统之一,拥有强大的多媒体功能支持。

在Android上,我们可以通过多媒体框架来实现音频、视频和图像的处理和播放。

本文将介绍Android多媒体框架的概念和相关API,帮助开发者更好地掌握Android多媒体开发的技术。

1. 多媒体框架概述Android多媒体框架是一组API和工具,用于处理和播放音频、视频和图像等多媒体资源。

它为开发者提供了丰富的功能和灵活的控制,可以实现高质量的多媒体应用。

Android的多媒体框架主要包括以下几个部分:MediaRecorder(音视频录制类):用于录制音频和视频。

MediaPlayer(音视频播放类):用于播放音频和视频。

Mediac(音视频编解码类):用于音视频的编解码。

MediaExtractor(音视频分离器类):用于将音视频文件分离成音频和视频轨道。

AudioTrack(音频播放类):用于音频的低级播放。

SoundPool(音频播放类):用于短音频的播放。

ImageReader(图像读取类):用于读取图像数据。

,Android还提供了一些其他的辅助类和接口,如MediaSession、MediaBrowser、MediaMetadataRetriever等,用于更高级的多媒体功能实现和交互。

2. 音频处理和播放音频是Android多媒体开发中非常重要的一部分。

在Android 上,我们可以使用MediaPlayer或AudioTrack来处理和播放音频。

MediaPlayer是Android中最常用的音频播放类,它可以播放本地文件或网络上的音频流。

我们可以通过setDataSource()方法设置音频源,通过prepareAsync()方法准备音频流,并通过start()方法开始播放。

AudioTrack是一个低级的音频播放类,它可以直接操作音频数据。

我们可以通过创建AudioTrack对象,并设置音频参数和缓冲区来进行音频播放。

音视频编解码——LAME

音视频编解码——LAME

⾳视频编解码——LAME⼀、LAME简介LAME是⽬前⾮常优秀的⼀种MP3编码引擎,在业界,转码成Mp3格式的⾳频⽂件时,最常⽤的就是LAME库。

当达到320Kbit/s时,LAME 编码出来的⾳频质量⼏乎可以和CD的⾳质相媲美,并且还能保证整个⾳频⽂件的体积⾮常⼩,因此若要在移动端平台上编码MP3⽂件,使⽤LAME便成为唯⼀的选择。

⼆、使⽤场景操作系统:Android。

场景:1.录⾳时保存Mp3格式的⽂件2. 将wav⽆损⾳频⽂件转码成mp3这种体积相对较⼩的⾳频⽂件。

3.可以将获取到的⾳频流进⾏录制保存为mp3格式。

附:如何录制wav⽂件,在之前的博客⾥⾯我们讲过:三、开发准备LAME的源码是托管到上的,我们开发⼀个基于LAME的项⽬,就不得不下载其源码⽤于编译。

如果需要集成到Android系统上,就需要开发者具备⼀些NDK开发的能⼒。

四、开发过程下⾯针对Android使⽤Lame做了基本的封装,供实际开发过程中进⾏参考:⾸先,在java类中定义native⽅法。

private static native long nInit(int inSampleRate, int inChannels, int outSampleRate, int outBitrate, int model, int quality);private static native int nGetVersion(long lamePtr);private static native int mGetMp3bufferSize(long lamePtr);private static native int mGetMp3bufferSizeWithSamples(long lamePtr, int samples);private static native int nEncodeShortInterleaved(long lamePtr, short[] bufLR, int samples, byte[] outMp3buf);private static native int nEncodeShort(long lamePtr, short[] bufL, short[] bufR, int samples, byte[] outMp3buf);private static native int nFlush(long lamePtr, byte[] outBuf);private static native void nClose(long lamePtr);⽣成相应的.h的头⽂件,并实现该头⽂件,完成整体逻辑的编写。

mediacodec ndk编程 -回复

mediacodec ndk编程 -回复

mediacodec ndk编程-回复MediaCodec是Android平台上的一个多媒体编解码组件,可以用于对音视频数据进行编解码。

NDK (Native Development Kit) 是一套用于开发Android 应用程序的工具集,允许开发者使用C/C++语言编写原生代码并通过JNI (Java Native Interface) 与Java代码进行交互。

结合MediaCodec和NDK,我们可以进行MediaCodec的NDK编程,实现更高效、更灵活的音视频编解码功能。

文章将按照以下步骤介绍如何进行MediaCodec的NDK编程。

第一步:创建Android项目和NDK环境设置首先,我们需要创建一个Android项目,并设置好NDK的环境。

在创建项目时,需要选择支持NDK开发的选项,并在配置中指定NDK的路径。

第二步:编写JNI代码在项目中创建一个JNI目录,并编写JNI代码。

JNI代码是以C/C++语言编写的,用于实现与Java代码的交互。

在JNI代码中,我们将使用NDK提供的API来实现MediaCodec的相关功能。

第三步:编写Java代码在Android项目中创建一个Java类,并在其中调用JNI代码。

通过JNI接口,我们可以将Java传递的音视频数据传递给NDK代码进行编解码,然后将编解码后的数据返回给Java层进行处理。

第四步:配置ndk-build文件在JNI目录下创建一个Android.mk文件,用于配置NDK的编译参数。

通过该文件,可以指定编译器的选项、库的链接方式等。

第五步:编译和运行项目完成以上步骤后,可以通过ndk-build命令编译JNI代码,并生成.so文件。

然后,将生成的.so文件导入到Android项目中,并执行项目。

第六步:测试和优化在运行项目后,可以进行一系列的测试,确保编解码的功能正常。

如果发现性能问题,可以通过调整编码参数、优化算法或使用其他高效的编码方式来提升性能。

mediacodec ndk编程

mediacodec ndk编程

mediacodec ndk编程
MediaCodec NDK编程是指使用Android NDK(Native Development Kit)来开发使用MediaCodec API的应用程序。

MediaCodec API是Android中用于音视频编解码的API,它提
供了硬件加速的编解码功能,可以在开发中实现音视频数据的压缩、解压、编码和解码等操作。

在NDK编程中使用MediaCodec API可以有以下步骤:
1. 配置Android.mk文件:在NDK项目的Android.mk文件中
添加依赖库的链接,例如:LOCAL_LDLIBS += -lmediandk
2. 调用MediaCodec API:在NDK的C/C++代码中调用MediaCodec API来实现音视频编解码的操作,例如:创建编
解码器、配置编解码参数、调用start()方法来启动编解码器等。

3. 使用Buffer进行数据传输:通过设置输入输出缓冲区来传
输音视频数据,音频数据通过AudioBufferInfo来描述,视频
数据通过VideoBufferInfo来描述。

4. 处理编解码结果:通过获取编解码器的输出缓冲区来处理编解码结果,可以获得解码后的音视频数据,通过回调或写入文件等方式进行处理。

需要注意的是,MediaCodec API的使用需要对编解码相关的
知识有一定的了解,并且需要通过Android NDK来进行开发。

掌握C/C++编程语言和Android NDK开发技术的基础,对于进行MediaCodec NDK编程是非常有帮助的。

用Android NDK编译FFmpeg,RTSP手机视频

用Android NDK编译FFmpeg,RTSP手机视频

2010-12-03用Android NDK编译FFmpeg文章分类:移动开发用Android NDK编译FFmpegPOSTED AT: 2010-07-24 06:38:52 UTC | POSTED IN: Android | 69 COMMENTS| EDITAndroid内置的编解码器实在太少,于是我们需要FFmpeg。

Android提供了NDK,为我们使用FFmpeg这种C语言代码提供了方便。

不过为了用NDK编译FFmpeg,还真的花费了不少时间,也得到了很多人的帮助,最应该谢谢havlenapetr。

我觉得我现在这些方法算是比较简洁的了--下面就尽量詳細的说一下我是怎么在项目中使用FFmpeg的,但是基于我混乱的表达能力,有不明白的就问我。

你得了解JNI和Android NDK的基本用法,若觉得我的文章还不错,可以看之前写的JNI简单入门和Android NDK入门首先创建一个标准的Android项目vPlayerandroid create project -n vPlayer -t 8 -p vPlayer -k me.abitno.vplayer -a PlayerView然后在vPlayer目录里mkdir jni &&cd jniwget /releases/ffmpeg-0.6.tar.bz2tar xf ffmpeg-0.6.tar.bz2 &&mv ffmpeg-0.6 ffmpeg &&cd ffmpeg在ffmpeg下新建一个config.sh,内容如下,注意把PREBUILT和PLATFORM设置正确。

另外里面有些参数你也可以自行调整,我主要是为了配置一个播放器而这样设置的。

#!/bin/bashPREBUILT=/home/abitno/Android/android-ndk-r4/build/prebuilt/linux-x86 /arm-eabi-4.4.0PLATFORM=/home/abitno/Android/android-ndk-r4/build/platforms/android-8/arch-arm./configure --target-os=linux \--arch=arm \--enable-version3 \--enable-gpl \--enable-nonfree \--disable-stripping \--disable-ffmpeg \--disable-ffplay \--disable-ffserver \--disable-ffprobe \--disable-encoders \--disable-muxers \--disable-devices \--disable-protocols \--enable-protocol=file \ --enable-avfilter \--disable-network \--disable-mpegaudio-hp \--disable-avdevice \--enable-cross-compile \--cc=$PREBUILT/bin/arm-eabi-gcc \--cross-prefix=$ PREBUILT/bin/arm-eabi- \--nm=$PREBUILT/bin/arm-eabi-nm \--extra-cflags="-fPIC -DANDROID"\--disable-asm \--enable-neon \--enable-armv5te \--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$ PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"运行config.sh开始configurechmod +x config.sh./config.shconfigure完成后,编辑刚刚生成的config.h,找到这句#define restrict restrictAndroid的GCC不支持restrict关键字,于是修改成下面这样#define restrict编辑libavutil/libm.h,把其中的static方法都删除。

移动应用开发中如何进行音频与视频处理(二)

移动应用开发中如何进行音频与视频处理(二)

现如今,移动应用开发已经成为了人们日常生活不可或缺的一部分。

而在移动应用的开发过程中,随着科技的不断发展,音频和视频处理技术逐渐成为了必不可少的一环。

本文将探讨移动应用开发中如何进行音频与视频处理。

一、音频处理在移动应用开发中,音频处理是一项非常重要的技术。

通过对音频进行处理,可以提供更好的用户体验和更多的功能。

以下是一些常见的音频处理技术:1. 音频录制和播放:音频录制和播放是移动应用中最基本的音频处理功能。

开发人员可以使用系统提供的音频录制和播放接口,来实现录制和播放音频的功能。

2. 音频编辑和剪辑:音频编辑和剪辑是一项更高级的音频处理技术。

通过使用音频编辑和剪辑工具,可以对音频文件进行剪辑、合并、混音等操作,从而实现更加丰富多样的音频处理效果。

3. 音频特效:音频特效是一种可以改变音频质量和效果的处理技术。

通过添加特效,可以使音频更具有创意和艺术性。

一些常见的音频特效包括音频反转、混响、变速等。

4. 音频识别和转换:音频识别和转换是一项较为复杂的音频处理技术。

通过使用语音识别和转换技术,可以将音频文件转换成文本内容,或将文本内容转换成语音,以实现自动转录、语音合成等功能。

二、视频处理除了音频处理,移动应用开发中的视频处理也是非常重要的一部分。

通过对视频进行处理,可以提供更丰富多样的视觉体验。

以下是一些常见的视频处理技术:1. 视频录制和播放:视频录制和播放是移动应用中最基本的视频处理功能。

开发人员可以使用系统提供的视频录制和播放接口,来实现录制和播放视频的功能。

2. 视频编辑和剪辑:视频编辑和剪辑是一项更高级的视频处理技术。

通过使用视频编辑和剪辑工具,可以对视频文件进行剪辑、合并、特效添加等操作,从而实现更具创意和个性化的视频处理效果。

3. 视频编码和解码:视频编码和解码是一种对视频进行压缩和解压缩的处理技术。

通过使用视频编码和解码算法,可以在保证视频质量的前提下,减小视频文件大小,以提高视频传输和存储的效率。

音视频编解码理解音视频处理的编程原理

音视频编解码理解音视频处理的编程原理

音视频编解码理解音视频处理的编程原理音视频编解码是指将音视频信号转换为数字信号的过程,然后再将数字信号转换为可播放的音视频信号的过程。

在现代多媒体应用中,音视频编解码在很多方面都扮演着重要的角色,包括音频录制、音频处理、视频录制、视频处理等。

本文将详细介绍音视频编解码的原理以及与编程相关的技术。

一、音视频编解码的基本原理音视频编解码的基本原理是将模拟信号(如声音、图像)转换为数字信号,然后对数字信号进行压缩和解压缩处理,最后将解压缩后的信号转换为模拟信号以供播放。

整个过程可以分为以下几个关键步骤:1. 采样与量化:音视频信号是连续的模拟信号,在进行编码处理之前,需要对信号进行采样和量化操作。

采样是指周期性地记录信号的数值,量化是指将采样得到的连续信号的值映射为离散的数值。

2. 压缩编码:在音视频处理过程中,数据量通常非常庞大,如果直接将原始数据进行存储和传输,会导致资源浪费和传输速度慢。

因此,压缩编码技术应运而生。

压缩编码是通过编码算法对音视频信号进行压缩,减小数据量。

常见的音视频压缩编码算法有MPEG、H.264等。

3. 压缩数据传输与存储:经过压缩编码后的音视频数据可以更加高效地进行传输和存储。

传输方面,可以通过网络协议(如RTSP、RTP)将音视频数据传输到远程设备进行播放。

存储方面,可以将音视频数据保存在本地设备或其他存储介质中。

4. 解压缩处理:在音视频播放过程中,需要对编码后的音视频数据进行解压缩处理。

解压缩是压缩的逆过程,通过解码算法将压缩后的音视频数据还原为原始的数字信号。

5. 数字信号转换为模拟信号:解压缩处理后的音视频数据是数字信号,需要将其转换为模拟信号以供播放。

这一过程叫做数模转换,常见的设备有扬声器和显示器等。

二、音视频编码相关的编程原理与技术音视频编码相关的编程原理与技术主要包括以下几个方面:1. 编码库与解码库:编码库是实现音视频压缩编码的关键组件,解码库则是实现解压缩处理的关键组件。

mediacodec压缩参数

mediacodec压缩参数

mediacodec压缩参数
MediaCodec 是Android 中用于音视频编解码的框架,它可以与Camera、SurfaceView、SurfaceTexture 等其他框架配合使用,实现高效的视频录制或播放功能。

在使用MediaCodec 进行视频编码时,需要设置一些压缩参数,以控制编码的输出质量及性能。

在设置MediaCodec 的压缩参数时,需要设置以下3 个主要参数:
1.编码器类型:MediaCodec 支持多种编码器类型,如H.264、VP8、H.265 等。

不同的编码器类型会影响编码的效率和输出质量,需要根据实际需求进行选择。

2.视频分辨率和帧率:分辨率和帧率是影响视频质量的重要因素,需要根据实际需求进行选择。

一般来说,较高的视频分辨率和帧率会导致更好的视频质量,但同时也会增加编码的负担和输出文件大小。

3.视频比特率:比特率是指视频输出的数据量大小,以每秒的比特数(bps)表示。

增加比特率可以提高视频输出的质量,但同时也会增加编码时间和输出文件大小。

需要根据实际需求进行选择。

除了这些主要参数外,MediaCodec 还支持一些其他的压缩参数,如I 帧间隔、码率控制方式、颜色格式等。

这些参数同样也可以根据实际需求进行调整,以达到最优的编码效果。

总的来说,设置MediaCodec 的压缩参数需要综合考虑多个因素,如视频质量、编码效率、输出文件大小等等。

需要根据实际需求进行选择,并进行不断的试验和优化,以实现最佳的编码效果和性能表现。

Android开发中的视频播放和流媒体处理技术(六)

Android开发中的视频播放和流媒体处理技术(六)

Android开发中的视频播放和流媒体处理技术在当今数字化时代,视频播放和流媒体处理技术在移动应用开发中扮演着至关重要的角色。

无论是社交媒体、在线教育还是即时通讯应用,视频都是用户最常用的交流和娱乐形式之一。

为了提供高质量的视频体验,Android开发者需要掌握视频播放和流媒体处理的关键技术。

一、视频播放技术1. 视频解码视频解码是将视频文件中的压缩数据还原为可视的图像的过程。

Android系统支持多种视频解码器,如、和VP9等。

开发者可以根据需求选择合适的解码器,并通过硬件加速来提高解码效率,以提供流畅的视频播放。

2. 播放器框架Android提供了多个播放器框架,其中最常用的是MediaPlayer 和ExoPlayer。

MediaPlayer是Android原生的播放器,简单易用,但功能比较有限。

ExoPlayer是Google推荐的高级播放器框架,支持更多的媒体格式和功能,如自适应流媒体、倍速播放和跳转到指定位置等。

3. 视频控制在视频播放过程中,用户通常需要进行一些控制操作,如播放/暂停、快进/快退和调整音量等。

开发者可以通过控制播放器的API来实现这些功能,并根据用户交互来更新播放器界面。

二、流媒体处理技术1. 流媒体协议在实现视频流媒体处理时,选择合适的流媒体协议对于提供良好的用户体验至关重要。

目前常用的流媒体协议包括HTTP、RTSP和RTMP 等。

HTTP协议广泛应用于各类互联网视频平台,RTSP协议适用于实时流媒体传输,RTMP协议则主要用于低延迟的直播推流。

2. 自适应码率自适应码率是一种动态调整视频码率的技术,可根据网络状况选择合适的码率以保证视频的连续播放和流畅性。

开发者可以通过使用自适应码率算法,并与流媒体服务器进行通信,动态改变视频码率和分辨率。

3. 实时编码实时编码是指将实时音视频数据转换为特定格式的过程,如和AAC等。

在实时通讯和直播应用中,实时编码是必不可少的,要求编码器能够实时处理庞大的音视频数据流。

基于Android和H.264的高清解码系统研究

基于Android和H.264的高清解码系统研究

基于Android和H.264的高清解码系统研究摘要:本文将开源的ffmpeg提供的 h.264解码器进行裁剪优化,从中提取 h.264 解码的核心部分,并移植到android平台,完成了一种android平台下的h.264解码方案的设计,并在真机下进行了测试取得了较好的解码播放效果。

关键词:android;h.264;解码器;ffmpeg【中图分类号】n94-00 引言h.264/avc标准是一种高性能的视频编解码技术,相比其它标准具有更高的压缩率、高质量图像、容错功能、并有很强的网络适应性。

近年来android系统的也迅猛发展和日趋成熟,其因其具有开放性、便携性、良好的兼容性和可无缝结合网络通信等特点,android操作系统在未来嵌入式物联网领域中将会有更广泛的应用。

目前越来越多的android视频应用被开发出来,而人们追求的视频高清化和目前网络带宽及智能手持设备解码能力均不足的矛盾也逐渐凸显出来,本文设计的基于android系统的h.264在线高清解码系统就可以解决这一问题。

1 android操作系统简介android系统是一种以linux为内核开发的专门面向移动平台的开源智能操作系统,具有丰富的硬件资源和软件应用程序资源、支持各种网络协议和触屏输入,短短的几年时间,android凭借这些特性,已经在智能手机领域占据了非常重要的位置。

随着物联网时代的到来,android系统的前景将更加不可限量。

android系统由以下三个部分组成: linux内核层、android 运行时库和其他库层、应用程序层。

linux内核层用来提供系统的底层服务,包括安全机制、内存管理、进程管理、网络堆栈及一系列的驱动模块。

作为一个虚拟的中间层,该层位于硬件与其它的软件层之间。

需要注意的是,这个内核操作系统并非类gnu/linux的,所以其系统库、系统初始化和编程接口都和标准的linux系统有所不同的。

android运行时库和其他库层包含一组核心库(提供java语言核心库内的大部分功能)和dalvik虚拟机。

移动应用开发技术中的音频视频处理和播放

移动应用开发技术中的音频视频处理和播放

移动应用开发技术中的音频视频处理和播放随着移动应用的飞速发展,音频视频处理和播放已经成为移动应用开发的重要技术之一。

无论是音乐应用、视频应用还是社交媒体应用,都需要在移动设备上对音频和视频进行处理和播放。

本文将探讨在移动应用开发中音频视频处理和播放的相关技术和挑战。

一、音频处理技术在移动应用中,音频处理涵盖了多个方面,包括录音、音频编解码、音频格式转换、音频编辑等。

录音是指通过移动设备的麦克风将声音转化为数字信号,供后续处理和存储使用。

音频编解码是将音频数据转换为特定格式的过程,以便在不同设备和平台上播放。

音频格式转换是指将一个音频格式转换为另一个音频格式,以满足不同设备和系统的需求。

音频编辑是对音频进行剪切、合并、混合等操作,以实现音频的定制化和个性化。

在实际开发中,我们可以使用一些开源的音频处理库,如FFmpeg、OpenSLES等。

FFmpeg是一个强大的音视频处理框架,支持多种音视频格式和编解码方式,可以在移动应用中实现音频的录制、编解码、格式转换等功能。

OpenSL ES是一种低延迟的音频处理框架,提供了更高效的音频处理和播放能力。

通过使用这些音频处理库,开发者可以更加方便地实现音频处理和播放的功能。

二、视频处理技术与音频处理类似,视频处理也涵盖了多个方面,包括视频录制、视频编解码、视频格式转换、视频编辑等。

视频录制是指通过移动设备的摄像头将图像转化为数字信号,并结合音频信号进行保存和管理。

视频编解码是将视频数据转换为特定格式的过程,以便在不同设备和平台上播放。

视频格式转换是指将一个视频格式转换为另一个视频格式,以满足不同设备和系统的需求。

视频编辑是对视频进行剪切、合并、特效添加等操作,以实现视频的定制化和个性化。

在实际开发中,我们可以使用一些开源的视频处理库,如FFmpeg、MediaCodec等。

FFmpeg除了支持音频处理,还支持视频处理,可以实现视频的录制、编解码、格式转换等功能。

移动应用开发中如何进行音频与视频处理(七)

移动应用开发中如何进行音频与视频处理(七)

移动应用开发中如何进行音频与视频处理随着智能手机的普及和移动互联网的迅速发展,移动应用开发已经成为了一个热门的行业。

而音频与视频处理是移动应用中经常涉及到的一个重要环节。

本文将重点论述移动应用开发中如何进行音频与视频处理的方法和技巧。

一、音频处理在移动应用中,音频处理可以包括音频录制、音频剪辑、音频混音、音频转码等功能。

下面将分别介绍这些功能的处理方法。

1. 音频录制音频录制是移动应用中经常用到的功能,可以通过调用设备的麦克风进行录制。

在Android平台上,可以使用MediaRecorder类来进行音频录制。

具体使用方法可以参考相关的开发文档。

2. 音频剪辑音频剪辑是指将录制好的音频文件进行裁剪,只保留需要的部分。

可以使用Android平台提供的MediaExtractor和MediaMuxer类来实现音频剪辑功能。

具体的操作流程是先使用MediaExtractor类读取原始音频文件,然后再使用MediaMuxer类将需要的部分写入新的音频文件中。

3. 音频混音音频混音是将多个音频文件合并为一个文件,可以用于制作音乐、配乐等场景。

在Android平台上,可以使用AudioTrack类进行音频的混音操作。

具体的操作流程是将多个音频文件解码成PCM数据,然后通过AudioTrack类将PCM数据混合在一起,并输出为一个新的音频文件。

4. 音频转码音频转码是将一个音频文件转换成其他格式的文件,可以用于实现音频格式的互转。

在Android平台上,可以使用MediaCodec类来进行音频的转码操作。

具体的操作流程是将原始音频文件解码成PCM数据,然后再将PCM数据编码成目标音频格式,最后保存为新的音频文件。

二、视频处理在移动应用中,视频处理可以包括视频录制、视频剪辑、视频合成、视频转码等功能。

下面将分别介绍这些功能的处理方法。

1. 视频录制视频录制是移动应用中常用到的功能,可以通过调用设备的摄像头进行录制。

Android开发中的视频播放和流媒体处理技术

Android开发中的视频播放和流媒体处理技术

Android开发中的视频播放和流媒体处理技术在当今数字化时代,视频成为了人们交流、娱乐与学习的重要方式之一。

而在Android开发中,对于视频播放和流媒体处理技术的掌握就显得尤为重要。

本文将从视频编解码、视频格式、流媒体传输以及播放器设计等角度,探讨Android开发中的视频播放和流媒体处理技术。

一、视频编解码技术视频编解码是视频播放中的核心环节,它负责将压缩的视频数据进行解码,并转换为可供播放的图像和声音。

在Android开发中,常用的视频编解码技术包括、VP8等。

是一种常用的视频编码技术,它在压缩视频数据的同时,保持较高的视频质量。

Android系统内置了相应的解码器,可以直接解码格式的视频。

VP8是一种基于WebM格式的开放式视频编码技术,它具有比更好的性能表现和更低的延迟。

在Android系统中,也可以通过Google提供的VP8解码库进行VP8格式视频的解码。

二、视频格式不同的视频格式对于Android开发中的视频播放和流媒体处理技术产生着重要的影响。

常见的视频格式包括MP4、3GP、AVI等。

MP4是一种常用的视频格式,它具有较好的兼容性和压缩率。

在Android开发中,通过使用系统中的MediaPlayer类,可以轻松实现MP4格式视频的播放。

3GP是一种针对移动设备优化的视频格式,它具有较小的存储空间占用和较好的网络传输性能。

在Android开发中,通过使用系统的MediaPlayer类,同样可以实现3GP格式视频的播放。

AVI是一种流行的音视频格式,它可以容纳多种编码格式的音视频数据。

在Android开发中,通过使用FFmpeg等第三方库,可以实现AVI格式视频的解码和播放。

三、流媒体传输技术流媒体传输是指将音视频数据实时传输到网络上,使用户能够边下载边播放。

在Android开发中,常用的流媒体传输技术包括HTTP、RTSP等。

HTTP协议是一种常用的网页传输协议,在流媒体传输中也得到了广泛应用。

android的ffmpeg原理

android的ffmpeg原理

android的ffmpeg原理Android的ffmpeg原理1. 什么是ffmpeg•FFmpeg是一套开源免费的音视频处理工具集合,可以进行音视频的编解码、转码、格式转换、流媒体处理等。

•它由一些用C语言编写的库和工具组成,是目前应用最广泛的音视频开源项目之一。

2. ffmpeg的应用场景•视频转码:将视频从一种格式转换为另一种格式,如将MP4视频转换为AVI格式。

•音视频解码:将编码后的音视频文件解码成原始的音频流和视频流。

•音视频编码:将原始的音频流和视频流编码为特定格式的音视频文件。

•视频剪辑:提取视频指定片段,或将多个视频拼接成一个。

•音视频处理:包括添加水印、调整画面亮度、对声音进行降噪等操作。

3. ffmpeg的原理音视频编解码原理•音视频编解码需要使用特定的编码器和解码器。

•编码器负责将原始音视频数据编码为指定格式的数据,如编码器将视频流编码为格式。

•解码器则负责将编码后的音视频数据解码为原始数据。

•ffmpeg中集成了许多常见的音视频编解码器,可以处理多种不同格式的音视频文件。

音视频流处理原理•ffmpeg可以通过读取和写入音视频流的方式进行处理。

•音视频流可以是来自文件、摄像头、网络等来源。

•输入音视频流经过解码器解码后,得到原始的音频流和视频流。

•处理后的原始数据可以经过编码器编码,再写入到文件、网络等输出源。

应用于Android的ffmpeg•在Android平台上,可以通过在JNI层调用ffmpeg库的方式来使用其功能。

•JNI(Java Native Interface)是Java提供的一种机制,可以实现Java和本地C/C++代码的相互调用。

•通过JNI调用ffmpeg库,可以在Android应用中使用ffmpeg的功能,例如进行视频转码、音频解码等操作。

4. 使用ffmpeg的步骤1.引入ffmpeg库:在Android项目中引入ffmpeg库文件,并配置相应的依赖关系。

Android最简单的视频播放器之MediaCodec硬件解码器封装(二)

Android最简单的视频播放器之MediaCodec硬件解码器封装(二)

Android最简单的视频播放器之MediaCodec硬件解码器封装(⼆)⼀、概述 MediaCodec是Android提供的硬件编解码器API,根据此api⽤户可以对媒体格式的⽂件执⾏编解码。

其单独没法⼯作还需要配合上⼀节介绍的 案例:本例最主要的是三个类,分别是BaseDecoder.java 、AudioDecoder、VideoDecoder.java即⾳视频解码类实例⼆、代码实例 1.BaseDecoder.java:硬件解码器基类import android.media.MediaCodec;import android.media.MediaFormat;import android.util.Log;import com.yw.thesimpllestplayer.extractor.IExtractor;import java.io.File;import java.nio.ByteBuffer;/*** @ProjectName: TheSimpllestplayer* @Package: com.yw.thesimpllestplayer.mediaplayer.decoder* @ClassName: BaseDecoder* @Description: 硬件解码器基类* @Author: wei.yang* @CreateDate: 2021/11/6 10:32* @UpdateUser: 更新者:wei.yang* @UpdateDate: 2021/11/6 10:32* @UpdateRemark: 更新说明:* @Version: 1.0*/public abstract class BaseDecoder implements IDecoder {private String filePath = null;public BaseDecoder(String filePath) {this.filePath = filePath;}private static final String TAG = "BaseDecoder";//-------------线程相关------------------------/*** 解码器是否在运⾏*/private boolean mIsRunning = true;/*** 线程等待锁*/private Object mLock = new Object();/*** 是否可以进⼊解码*/private boolean mReadyForDecode = false;//---------------状态相关-----------------------/*** ⾳视频解码器(硬件解码器)*/private MediaCodec mCodec = null;/*** ⾳视频数据读取器*/private IExtractor mExtractor = null;/*** 解码输⼊缓存区*/private ByteBuffer[] mInputBuffers = null;/*** 解码输出缓存区private ByteBuffer[] mOutputBuffers = null;/*** 解码数据信息*/private MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo(); /*** 初始化解码状态*/private DecodeState mState = DecodeState.STOP;/*** 解码状态回调*/protected IDecoderStateListener mStateListener;/*** 流数据是否结束*/private boolean mIsEOS = false;/*** 视频宽度*/private int mVideoWidth = 0;/*** 视频⾼度*/private int mVideoHeight = 0;/*** 视频时长*/private long mDuration = 0;/*** 视频结束时间*/private long mEndPos = 0;/*** 开始解码时间,⽤于⾳视频同步*/private long mStartTimeForSync = -1L;/*** 是否需要⾳视频渲染同步*/private boolean mSyncRender = true;@Overridepublic void pause() {mState = DecodeState.PAUSE;}@Overridepublic void goOn() {mState = DecodeState.DECODING;notifyDecode();}@Overridepublic long seekTo(long pos) {return0;}@Overridepublic long seekAndPlay(long pos) {return0;}@Overridepublic void stop() {mState = DecodeState.STOP;mIsRunning = false;notifyDecode();}@Overridepublic boolean isDecoding() {return mState == DecodeState.DECODING;}@Overridepublic boolean isSeeking() {return mState == DecodeState.SEEKING;}@Overridereturn mState == DecodeState.STOP;}@Overridepublic int getWidth() {return mVideoWidth;}@Overridepublic int getHeight() {return mVideoHeight;}@Overridepublic long getDuration() {return mDuration;}@Overridepublic long getCurTimeStamp() {return mBufferInfo.presentationTimeUs / 1000;}@Overridepublic int getRotationAngle() {return0;}@Overridepublic MediaFormat getMediaFormat() {return mExtractor.getFormat();}@Overridepublic int getTrack() {return0;}@Overridepublic String getFilePath() {return filePath;}@Overridepublic IDecoder withoutSync() {mSyncRender = false;return this;}@Overridepublic void setSizeListener(IDecoderProgress iDecoderProgress) {}@Overridepublic void setStateListener(IDecoderStateListener iDecoderStateListener) { this.mStateListener = iDecoderStateListener;}@Overridepublic void run() {//解码开始时改变解码状态if (mState == DecodeState.STOP) {mState = DecodeState.START;}if (mStateListener != null) {mStateListener.decoderPrepare(this);}//初始化并启动解码器,如果解码失败则暂停线程if (!init()) return;//开始解码Log.e(TAG, "开始解码");try {while (mIsRunning) {//循环解码渲染if (mState != DecodeState.START &&mState != DecodeState.DECODING &&mState != DecodeState.SEEKING) {Log.i(TAG, "进⼊等待:" + mState);//解码进⼊等待waitDecode();// ---------【同步时间矫正】-------------//当前系统时间减去bufferinfo中的时间=等待解码流失的时间mStartTimeForSync = System.currentTimeMillis() - getCurTimeStamp(); }//停⽌解码,就直接退出循环了if (!mIsRunning ||mState == DecodeState.STOP) {mIsRunning = false;break;}//更新开始解码时间if (mStartTimeForSync == -1L) {mStartTimeForSync = System.currentTimeMillis();}//如果数据没有解码完毕,将数据推⼊解码器解码if (!mIsEOS) {//【解码步骤:2. 见数据压⼊解码器输⼊缓冲】mIsEOS = pushBufferToDecoder();}//将解码后的数据从缓冲区中拉取出来int outputBufferIndex = pullBufferFromDecoder();if (outputBufferIndex >= 0) {// ---------【⾳视频同步】-------------if (mSyncRender && mState == DecodeState.DECODING) {sleepRender();}//渲染if (mSyncRender) {render(mOutputBuffers[outputBufferIndex], mBufferInfo);}//将解码数据传出去Frame frame = new Frame();frame.buffer = mOutputBuffers[outputBufferIndex];frame.setBufferInfo(mBufferInfo);if (mStateListener != null) {mStateListener.decodeOneFrame(this, frame);}//释放输出缓冲mCodec.releaseOutputBuffer(outputBufferIndex, true);if (mState == DecodeState.START) {mState = DecodeState.PAUSE;}}//判断是否解码完成if (mBufferInfo.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM) { Log.e(TAG, "解码结束");mState = DecodeState.FINISH;if (mStateListener != null) {mStateListener.decoderFinish(this);}}}} catch (Exception e) {e.printStackTrace();} finally {finishDecode();release();}}/*** 初始化解码器,如果初始化失败则停⽌解码** @return*/private boolean init() {//如果⽂件路径不存在或者⽂件路径指定的⽂件为空if (filePath == null || !new File(filePath).exists()) {Log.e(TAG, "⽂件路径异常");if (mStateListener != null) {mStateListener.decoderError(this, "⽂件路径为空");}return false;}if (!check()) return false;//初始化数据提取器mExtractor = initExtractor(filePath);if (mExtractor == null || mExtractor.getFormat() == null) {Log.e(TAG, "⽆法解析⽂件");if (mStateListener != null) {mStateListener.decoderError(this, "⽆法解析⽂件");return false;}//初始化参数if (!initParams()) return false;//初始化渲染器if (!initRender()) return false;//初始化解码器if (!initCodec()) return false;return true;}/*** 初始化媒体时长及初始化媒体参数** @return*/private boolean initParams() {try {MediaFormat format = mExtractor.getFormat();mDuration = format.getLong(MediaFormat.KEY_DURATION) / 1000;if (mEndPos == 0L) mEndPos = mDuration;initSpecParams(format);} catch (Exception e) {e.printStackTrace();Log.e(TAG, "提取媒体⽂件时长或者初始化媒体参数失败:" + e.getMessage());if (mStateListener != null) {mStateListener.decoderError(this, "提取媒体⽂件时长或者初始化媒体参数失败"); }return false;}return true;}private boolean initCodec() {try {//获取媒体类型String mimeType = mExtractor.getFormat().getString(MediaFormat.KEY_MIME);//创建解码器mCodec = MediaCodec.createDecoderByType(mimeType);//配置解码器if (!configCodec(mCodec, mExtractor.getFormat())) {//解码线程进⼊等待waitDecode();}//开始解码mCodec.start();//从缓冲区中去取输⼊缓冲mInputBuffers = mCodec.getInputBuffers();//从缓冲区中取出输出缓冲mOutputBuffers = mCodec.getOutputBuffers();} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 解码线程进⼊等待*/private void waitDecode() {try {if (mState == DecodeState.PAUSE) {if (mStateListener != null) {mStateListener.decoderPause(this);}}synchronized (mLock) {mLock.wait();}} catch (Exception e) {e.printStackTrace();}}/*** 通知解码线程继续运⾏*/protected void notifyDecode() {synchronized (mLock) {mLock.notifyAll();if (mState == DecodeState.DECODING) {if (mStateListener != null) {mStateListener.decoderRunning(this);}}}/*** 向缓冲区中压缩解码前的数据** @return*/private boolean pushBufferToDecoder() {//从缓冲区中获取⼀个bufferindexint inputBufferIndex = mCodec.dequeueInputBuffer(1000);boolean isEndOfStream = false;if (inputBufferIndex >= 0) {//根据inputBufferIndex获取inputBufferByteBuffer inputBuffer = mInputBuffers[inputBufferIndex];//使⽤数据提取器Extractor读取⼀帧数据int sampleSize = mExtractor.readBuffer(inputBuffer);if (sampleSize < 0) {//如果数据帧兑取失败则说明读完了mCodec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); isEndOfStream = true;} else {//将读取到的数据送⼊缓冲区(压⼊)mCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, mExtractor.getCurrentTimestamp(), 0);}}return isEndOfStream;}/*** 从缓冲区中取出解码后的数据** @return*/private int pullBufferFromDecoder() {//从缓冲区中取出outputbufferindexint outputBufferIndex = mCodec.dequeueOutputBuffer(mBufferInfo, 1000);switch (outputBufferIndex) {case _OUTPUT_FORMAT_CHANGED:break;case _TRY_AGAIN_LATER:break;case _OUTPUT_BUFFERS_CHANGED:mOutputBuffers = mCodec.getOutputBuffers();break;default:return outputBufferIndex;}return -1;}/*** ⾳视频同步*/private void sleepRender() {try {long passTime = System.currentTimeMillis() - mStartTimeForSync;long currTime = getCurTimeStamp();if (currTime > passTime) {Thread.sleep(currTime - passTime);}} catch (Exception e) {e.printStackTrace();}}/*** 释放解码器*/private void release() {try {Log.i(TAG, "解码停⽌,释放解码器");mState = DecodeState.STOP;mIsEOS = false;mExtractor.stop();mCodec.stop();mCodec.release();if (mStateListener != null) {mStateListener.decoderDestroy(this);} catch (Exception e) {e.printStackTrace();}}/*** 检查⼦类参数** @return*/public abstract boolean check();/*** 初始化数据提取器** @param filePath 媒体⽂件路径* @return 数据提取器*/public abstract IExtractor initExtractor(String filePath);/*** 初始化⼦类⾃⼰持有的媒体参数** @param format*/public abstract void initSpecParams(MediaFormat format);/*** 配置解码器** @param codec 硬件解码器* @param format 媒体格式参数* @return*/public abstract boolean configCodec(MediaCodec codec, MediaFormat format);/*** 初始化渲染器** @return*/public abstract boolean initRender();/*** 执⾏渲染操作** @param outputBuffer 输出的渲染数据* @param bufferInfo 解码出来的数据*/public abstract void render(ByteBuffer outputBuffer, MediaCodec.BufferInfo bufferInfo); /*** 结束解码*/public abstract void finishDecode();} 2.AudioDecoder.java:⾳频解码器import android.media.MediaCodec;import android.media.MediaFormat;import com.yw.thesimpllestplayer.audioplayer.AudioPlayer;import com.yw.thesimpllestplayer.extractor.AudioExtractor;import com.yw.thesimpllestplayer.extractor.IExtractor;import java.nio.ByteBuffer;/*** @ProjectName: TheSimpllestplayer* @Package: com.yw.thesimpllestplayer.mediaplayer.decoder* @ClassName: AudioDecoder* @Description: ⾳频解码器* @Author: wei.yang* @CreateDate: 2021/11/6 13:55* @UpdateUser: 更新者:wei.yang* @UpdateDate: 2021/11/6 13:55* @UpdateRemark: 更新说明:* @Version: 1.0*/private AudioPlayer audioPlayer;public AudioDecoder(String filePath) {super(filePath);}@Overridepublic boolean check() {return true;}@Overridepublic IExtractor initExtractor(String filePath) {return new AudioExtractor(filePath);}@Overridepublic void initSpecParams(MediaFormat format) {if (audioPlayer == null) {audioPlayer = new AudioPlayer(format);}}@Overridepublic boolean configCodec(MediaCodec codec, MediaFormat format) {codec.configure(format, null, null, 0);return true;}@Overridepublic boolean initRender() {audioPlayer.initPlayer();return true;}@Overridepublic void render(ByteBuffer outputBuffer, MediaCodec.BufferInfo bufferInfo) { audioPlayer.play(outputBuffer, bufferInfo);}@Overridepublic void finishDecode() {audioPlayer.stop();audioPlayer.release();}} 2.VideoDecoder.java:视频解码器import android.media.MediaCodec;import android.media.MediaFormat;import android.util.Log;import android.view.Surface;import com.yw.thesimpllestplayer.extractor.IExtractor;import com.yw.thesimpllestplayer.extractor.VideoExtractor;import java.nio.ByteBuffer;/*** @ProjectName: TheSimpllestplayer* @Package: com.yw.thesimpllestplayer.mediaplayer.decoder* @ClassName: VideoDecoder* @Description: 视频解码器* @Author: wei.yang* @CreateDate: 2021/11/6 13:49* @UpdateUser: 更新者:wei.yang* @UpdateDate: 2021/11/6 13:49* @UpdateRemark: 更新说明:* @Version: 1.0*/public class VideoDecoder extends BaseDecoder {private static final String TAG = "VideoDecoder";private Surface surface;public VideoDecoder(String filePath, Surface surface) {super(filePath);this.surface = surface;@Overridepublic boolean check() {if (surface == null) {Log.e(TAG, "Surface不能为空");if (mStateListener != null) {mStateListener.decoderError(this, "显⽰器为空");}return false;}return true;}@Overridepublic IExtractor initExtractor(String filePath) {return new VideoExtractor(filePath);}@Overridepublic void initSpecParams(MediaFormat format) {}@Overridepublic boolean configCodec(MediaCodec codec, MediaFormat format) {if (surface != null) {codec.configure(format, surface, null, 0);notifyDecode();} else {if (mStateListener != null) {mStateListener.decoderError(this, "配置解码器失败,因为Surface为空"); }Log.e(TAG, "配置解码器失败,因为Surface为空");return false;}return true;}@Overridepublic boolean initRender() {return true;}@Overridepublic void render(ByteBuffer outputBuffer, MediaCodec.BufferInfo bufferInfo) { }@Overridepublic void finishDecode() {}}。

android mediacodec 用法

android mediacodec 用法

android mediacodec 用法Android Mediacodec 是Android 提供的一个用于音视频编解码的API,它可以让开发者在自己的应用程序中直接使用硬件加速的编解码器来进行音视频处理。

本文将以"Android Mediacodec 用法"为主题,详细介绍Mediacodec的使用方法。

一、什么是Android MediacodecAndroid Mediacodec 是Android 系统提供的一个多媒体编解码库,它可以让开发者使用硬件加速的编解码器来处理音频和视频数据。

相比于传统的软件编解码方式,Mediacodec 在性能上有很大的提升,能够更好地满足应用程序对音视频处理的需求。

二、Mediacodec 的基本使用步骤在开始使用Mediacodec 之前,首先需要了解一下Mediacodec 的基本使用步骤。

下面是Mediacodec 的基本使用步骤:1. 创建Mediacodec 对象:使用Mediacodec 的静态方法`createDecoderByType` 或`createEncoderByType` 来创建一个Mediacodec 对象。

需要传入一个String 类型的参数,表示要使用的编解码器的类型,例如"video/avc" 表示使用H.264 编解码器。

2. 配置Mediacodec:在创建Mediacodec 对象之后,需要通过调用`configure` 方法来配置Mediacodec。

需要传入一个MediaFormat 对象,该对象需要指定各种参数,例如输入数据的格式、输出数据的格式、编码码率等等。

3. 启动Mediacodec:在配置Mediacodec 完成之后,调用`start` 方法来启动Mediacodec。

4. 处理输入数据:使用Mediacodec 的`dequeueInputBuffer` 方法获取一个可以用于填充输入数据的ByteBuffer 对象,并将音视频数据填充到ByteBuffer 中。

mediacodec使用方法

mediacodec使用方法

mediacodec使用方法MediaCodec是Android平台上用于实时的音视频编解码的API。

通过使用MediaCodec,开发者可以高效地对音视频数据进行编解码操作,实现音视频的录制、播放、编解码等功能。

一、MediaCodec简介MediaCodec是Android提供的一个多媒体编解码器,它允许开发者对音频和视频进行编解码操作,是实现音视频处理的重要组件之一。

MediaCodec提供了硬件加速的选项,可以提高音视频编解码的性能,减少CPU的负载。

同时,它也支持软件编解码,适用于不支持硬件加速的平台。

二、MediaCodec的基本概念1. 编码器(Encoder):将原始的音视频数据压缩成特定格式的编码器,如将PCM音频编码为AAC格式。

2. 解码器(Decoder):将已经编码的音视频数据解压缩还原为原始的数据格式,如将AAC音频解码为PCM格式。

3. 媒体格式(MediaFormat):用于描述音视频数据的格式,包括媒体类型(音频或视频)、采样率、位宽、编码器名称等。

4. 输入缓冲区(Input Buffer):用于存储待编码的音视频数据,在编码之前需要将数据填充到输入缓冲区。

5. 输出缓冲区(Output Buffer):用于存储编码后或解码后的音视频数据,在编解码完成后可以从输出缓冲区获取数据。

三、使用MediaCodec进行音视频编码以下是使用MediaCodec进行音视频编码的步骤:1. 创建一个MediaCodec实例:调用MediaCodec.createEncoderByType()方法或MediaCodec.createDecoderByType()方法创建一个编码器或解码器实例。

传入媒体类型参数,如"audio/mp4a-latm"表示AAC音频编码器。

2. 配置编码器或解码器:配置媒体格式(MediaFormat),包括音频采样率、位宽、声道数等信息。

mediacodec底层原理

mediacodec底层原理

mediacodec底层原理
MediaCodec是Android平台提供的一个多媒体编解码器,它可以用于音频和视频的编解码操作。

它的底层原理涉及到多个方面,包括硬件加速、编解码流程、缓冲区管理等。

首先,MediaCodec可以利用硬件加速来提高编解码性能。

Android平台上的部分设备支持硬件加速的编解码操作,这意味着MediaCodec可以利用设备上的专用硬件来执行编解码任务,从而提高性能并降低功耗。

这通常通过底层的硬件抽象层(HAL)来实现,使得MediaCodec可以与设备上的硬件编解码器进行交互。

其次,MediaCodec的编解码流程包括了数据输入、数据处理和数据输出三个主要阶段。

在数据输入阶段,应用程序将原始的音频或视频数据传递给MediaCodec进行编码或解码处理;在数据处理阶段,MediaCodec利用编解码器进行数据处理,包括压缩(编码)或解压缩(解码)操作;最后,在数据输出阶段,MediaCodec将处理后的数据输出到指定的目标,比如Surface或者ByteBuffer。

此外,MediaCodec还涉及到缓冲区的管理。

在编解码过程中,数据通常需要在不同的阶段进行缓冲,MediaCodec负责管理这些缓
冲区的分配、填充和释放。

这涉及到对数据的处理顺序和时序的管理,以确保数据能够按照正确的顺序进行处理和输出。

总的来说,MediaCodec的底层原理涉及到硬件加速、编解码流程和缓冲区管理等多个方面,它通过与设备上的硬件编解码器进行交互,实现了高效的音视频编解码功能。

希望这个回答能够全面解答你的问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android 音视频编解码ubuntu下ndk编译ffmpeg0.8.1ffmpeg最新版本有些问题,比如jni/liblibavcodec/ac3enc_combined.c在最新的版本中已经没有了,但是又多了一个ac3enc_template.c的文件。

虽然更新版本对于开发人员可以使用到更多的功能,但是如果这样乱改的话真的好无语,非常讨厌这种更新版本的不一致性,唉,只是抱怨一下我使用的还是稍微老一点的版本ffmpeg 0.8.1的,至少老的版本能搜到更多的资料,也比较稳定。

ffmpeg版本:ffmpeg 0.8.1(最新版本是0.10,但是有很多问题)NDK版本:ndk r6(ndk r7编译的话会出现各种错误)机器:32位系统:ubuntu注意:ndk r6+ffmpeg0.8.1+Android.mk+config.sh是经过测试过的,可以生成。

如果你用的其他版本的会出现各种问题前提:需要你配置好NDK的环境,还是说说吧一、下载并配置NDK环境变量(ubuntu下,windows下请使用cygwin)1、到/sdk/ndk/index.html下载NDK这里,ndk r6版本的下载地址是:/android/ndk/android-ndk-r6-linux-x86.tar.bz22、解压包到/home/loulijun/android/目录下3、$vim ~/.bashrc 在里面添加如下信息export NDK=/home/loulijun/android/android-ndk-r6107 export PATH=${PATH}:$NDK4、$source ~/.bashrc 使其生效注意:最新r7版本出现了一个关于awk问题,这个awk是64位的,所以如果你是32位机会遇到,具体解决办法见我的上篇博客:/loulijun/archive/2012/02/26/2368787.html二、下载ffmpeg源码包如果你想下载ffmpeg0.8.1版本(老版本),请点击这里:/releases/ffmpeg-0.8.1.tar.gz如果你想下载最新版本,可以到/download.html下载使用$git clone git:///ffmpeg.git ffmpeg但是下载后的虽然是最新且纯净的代码,可能Android.mk文件与之不完全匹配,如果非要用最新版本的话最好修改一下Android.mk吧(工作量有点大)三、配置ffmpeg环境可以系统目录下创建一个用于存放ffmpeg的目录,假如我们全部操作都在~/mywork/ndk/ffmpeg/目录下,将下载好的ffmpeg源码放在ffmpeg目录下,并改目录名字为jni(名字必须位jni,否则会出现如下的错误)。

另外,下面即将要说到的config.sh脚本和Android.mk文件也要放在这个目录下四、添加config.sh脚本到jni目录中在jin目录下创建名为config.sh脚本文件,在里面添加如下的内容这一步很重要,下面的这个脚本主要是用于生成config.h文件和config.mak文件,否则无法build下面内容就是config.sh文件了。

可点击这里下载:注意:需要修改cross-prefix、extra-cflags、extra-ldflags的路径./configure \ --disable-static \ --enable-shared \--enable-gpl \ --enable-version3 \ --enable-nonfree \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \--disable-avdevice \ --disable-avfilter \--disable-postproc \ --enable-small \--cross-prefix=/home/loulijun/android/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin /arm-linux-androideabi- \ --enable-cross-compile \--target-os=linux \--extra-cflags='-I/home/loulijun/android/android-ndk-r6/p latforms/android-9/arch-arm/usr/include' \--extra-ldflags='-L/home/loulijun/android/android-ndk-r6/ platforms/android-9/arch-arm/usr/lib -nostdlib' \--arch=arm \ --disable-symver \ --disable-debug \ --disable-stripping \ sed -i 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.hsed -i 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.hsed -i 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.hsed -i 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.hsed -i's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.hsed -i's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h五、执行config.sh脚本首先需要给config.sh权限使其能够执行$sudo chmod a+x config.sh执行config.sh脚本$./config.sh如果出现如下的样子就说明脚本执行成功了下面的WARNING可以不用管,不会对使用有影响六、添加Android.mk文件到jni目录中我们还需要在jni目录下添加一个Android.mk文件,使其交叉编译,内容如下。

也可以到https:///1126971下载,一样的LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE := ffmpeg include $(LOCAL_PATH)/config.mak LOCAL_CFLAGS := -DHAVE_AV_CONFIG_H -std=c99 AVUTIL_C_FILES= adler32.c \ aes.c \ audioconvert.c \ avstring.c \ base64.c \ cpu.c \ crc.c \ des.c \ error.c \ eval.c \ fifo.c \ file.c \ imgutils.c \intfloat_readwrite.c \ inverse.c \ lfg.c \ lls.c \ log.c \ lzo.c \ mathematics.c \ md5.c \ mem.c \ dict.c \ opt.c \ parseutils.c \ pixdesc.c \random_seed.c \ rational.c \ rc4.c \ samplefmt.c \ sha.c \ tree.c \ utils.c \ arm/cpu.cAVUTIL_SRC_FILES = $(addprefix libavutil/, $(sort$(AVUTIL_C_FILES))) AVCODEC_C_FILES = allcodecs.c \ audioconvert.c \ avpacket.c \ bitstream.c \bitstream_filter.c \ dsputil.c \ faanidct.c \ fmtconvert.c \ imgconvert.c \ jrevdct.c \ options.c\ parser.c \ raw.c \ rawdec.c \ resample.c \ resample2.c \ simple_idct.c \ utils.c \AVCODEC_C_FILES-$(CONFIG_AANDCT) +=aandcttab.cAVCODEC_C_FILES-$(CONFIG_AC3DSP) +=ac3dsp.cAVCODEC_C_FILES-$(CONFIG_CRYSTALHD) +=crystalhd.cAVCODEC_C_FILES-$(CONFIG_ENCODERS) += faandct.c jfdctfst.c jfdctint.cAVCODEC_C_FILES-$(CONFIG_DCT) += dct.c dct32_fixed.c dct32_float.cAVCODEC_C_FILES-$(CONFIG_DWT)+= dwt.cAVCODEC_C_FILES-$(CONFIG_DXVA2) +=dxva2.cFFT-FILES-$(CONFIG_HARDCODED_TABLES) +=cos_tables.ccos_fixed_tables.cAVCODEC_C_FILES-$(CONFIG_FFT) += avfft.cfft_fixed.c fft_float.c \$(FFT-FILES-yes)AVCODEC_C_FILES-$(CONFIG_GOLOMB) +=golomb.cAVCODEC_C_FILES-$(CONFIG_H264DSP) += h264dsp.ch264idct.cAVCODEC_C_FILES-$(CONFIG_H264PRED) +=h264pred.cAVCODEC_C_FILES-$(CONFIG_HUFFMAN) +=huffman.cAVCODEC_C_FILES-$(CONFIG_LPC) +=lpc.cAVCODEC_C_FILES-$(CONFIG_LSP) +=lsp.cAVCODEC_C_FILES-$(CONFIG_MDCT) += mdct_fixed.cmdct_float.cAVCODEC_C_FILES-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.c \ mpegaudiodsp_fixed.c \mpegaudiodsp_float.cRDFT-FILES-$(CONFIG_HARDCODED_TABLES)+= sin_tables.cAVCODEC_C_FILES-$(CONFIG_RDFT) += rdft.c $(RDFT-FILES-yes)AVCODEC_C_FILES-$(CONFIG_SINEWIN) += sinewin.cAVCODEC_C_FILES-$(CONFIG_VAAPI) +=vaapi.cAVCODEC_C_FILES-$(CONFIG_VDPAU) += vdpau.cAVCODEC_C_FILES-$(CONFIG_A64MULTI_ENCODER) +=a64multienc.celbg.cAVCODEC_C_FILES-$(CONFIG_A64MULTI5_ENCODER) +=a64multienc.c elbg.cAVCODEC_C_FILES-$(CONFIG_AAC_DECODER) += aacdec.c aactab.c aacsbr.c aacps.c \ aacadtsdec.c mpeg4audio.c kbdwin.cAVCODEC_C_FILES-$(CONFIG_AAC_ENCODER) += aacenc.c aaccoder.c \ aacpsy.c aactab.c \ psymodel.c iirfilter.c \ mpeg4audio.ckbdwin.cAVCODEC_C_FILES-$(CONFIG_AASC_DECODER) += aasc.c msrledec.cAVCODEC_C_FILES-$(CONFIG_AC3_DECODER) +=ac3dec.c ac3dec_data.c ac3.ckbdwin.cAVCODEC_C_FILES-$(CONFIG_AC3_ENCODER) +=ac3enc_combined.c ac3enc_fixed.c ac3enc_float.c ac3tab.c ac3.c kbdwin.cac3enc.cAVCODEC_C_FILES-$(CONFIG_AC3_FLOAT_ENCODER) +=ac3enc_float.c ac3tab.c ac3tab.c ac3.ckbdwin.cAVCODEC_C_FILES-$(CONFIG_AC3_FIXED_ENCODER) +=ac3enc_fixed.c ac3tab.c ac3tab.c ac3.cac3enc.cAVCODEC_C_FILES-$(CONFIG_ALAC_DECODER) +=alac.cAVCODEC_C_FILES-$(CONFIG_ALAC_ENCODER) +=alacenc.cAVCODEC_C_FILES-$(CONFIG_ALS_DECODER) += alsdec.c bgmc.c mpeg4audio.cAVCODEC_C_FILES-$(CONFIG_AMRNB_DECODER) += amrnbdec.c celp_filters.c \ celp_math.cacelp_filters.c \ acelp_vectors.c \acelp_pitch_delay.cAVCODEC_C_FILES-$(CONFIG_AMRWB_DECODER ) += amrwbdec.c celp_filters.c \ celp_math.cacelp_filters.c \ acelp_vectors.c \acelp_pitch_delay.clsp.cAVCODEC_C_FILES-$(CONFIG_AMV_DECODER) += sp5xdec.c mjpegdec.c mjpeg.cAVCODEC_C_FILES-$(CONFIG_ANM_DECODER) += anm.cAVCODEC_C_FILES-$(CONFIG_ANSI_DECODER) += ansi.ccga_data.cAVCODEC_C_FILES-$(CONFIG_APE_DECODER) += apedec.cAVCODEC_C_FILES-$(CONFIG_ASS_DECODER) += assdec.c ass.c ass_split.cAVCODEC_C_FILES-$(CONFIG_ASS_ENCODER) += assenc.c ass.cAVCODEC_C_FILES-$(CONFIG_ASV1_DECODER) += asv1.c mpeg12data.cAVCODEC_C_FILES-$(CONFIG_ASV1_ENCODER) += asv1.cmpeg12data.cAVCODEC_C_FILES-$(CONFIG_ASV2_DECODER) +=asv1.c mpeg12data.cAVCODEC_C_FILES-$(CONFIG_ASV2_ENCODER) += asv1.cmpeg12data.cAVCODEC_C_FILES-$(CONFIG_ATRAC1_DECODER) += atrac1.c atrac.cAVCODEC_C_FILES-$(CONFIG_ATRAC3_DECODER) += atrac3.c atrac.cAVCODEC_C_FILES-$(CONFIG_AURA_DECODER) += cyuv.cAVCODEC_C_FILES-$(CONFIG_AURA2_DECODER) +=aura.cAVCODEC_C_FILES-$(CONFIG_AVS_DECODER) +=avs.cAVCODEC_C_FILES-$(CONFIG_BETHSOFTVID_DECODER) += bethsoftvideo.cAVCODEC_C_FILES-$(CONFIG_BFI_DECODER) +=bfi.cAVCODEC_C_FILES-$(CONFIG_BINK_DECODER) += bink.c binkidct.cAVCODEC_C_FILES-$(CONFIG_BINKAUDIO_DCT_DECODER)+= binkaudio.cwma.cAVCODEC_C_FILES-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.c wma.cAVCODEC_C_FILES-$(CONFIG_BMP_DECODER) += bmp.c msrledec.cAVCODEC_C_FILES-$(CONFIG_BMP_ENCODER) += bmpenc.cAVCODEC_C_FILES-$(CONFIG_C93_DECODER) +=c93.cAVCODEC_C_FILES-$(CONFIG_CAVS_DECODER) += cavs.c cavsdec.c cavsdsp.c \ mpeg12data.cmpegvideo.cAVCODEC_C_FILES-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.cAVCODEC_C_FILES-$(CONFIG_CINEPAK_DECODER) += cinepak.cAVCODEC_C_FILES-$(CONFIG_CLJR_DECODER) +=cljr.cAVCODEC_C_FILES-$(CONFIG_CLJR_ENCODER) +=cljr.cAVCODEC_C_FILES-$(CONFIG_COOK_DECODER) +=cook.cAVCODEC_C_FILES-$(CONFIG_CSCD_DECODER) +=cscd.cAVCODEC_C_FILES-$(CONFIG_CYUV_DECODER) +=cyuv.cAVCODEC_C_FILES-$(CONFIG_DCA_DECODER) += dca.csynth_filter.cdcadsp.cAVCODEC_C_FILES-$(CONFIG_DCA_ENCODER) +=dcaenc.cAVCODEC_C_FILES-$(CONFIG_DFA_DECODER) +=dfa.cAVCODEC_C_FILES-$(CONFIG_DNXHD_DECODER) += dnxhddec.c dnxhddata.cAVCODEC_C_FILES-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.c dnxhddata.c \ mpegvideo_enc.c motion_est.c \ ratecontrol.c mpeg12data.c \mpegvideo.cAVCODEC_C_FILES-$(CONFIG_DPX_DECODER) +=dpx.cAVCODEC_C_FILES-$(CONFIG_DPX_ENCODER) +=dpxenc.cAVCODEC_C_FILES-$(CONFIG_DSICINAUDIO_DECODER) += dsicinav.cAVCODEC_C_FILES-$(CONFIG_DSICINVIDEO_DECODER) += dsicinav.cAVCODEC_C_FILES-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.cAVCODEC_C_FILES-$(CONFIG_DVBSUB_ENCODER) += dvbsub.cAVCODEC_C_FILES-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.cAVCODEC_C_FILES-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.cAVCODEC_C_FILES-$(CONFIG_DVVIDEO_DECODER) +=dv.c dvdata.cAVCODEC_C_FILES-$(CONFIG_DVVIDEO_ENCODER) += dv.c dvdata.cAVCODEC_C_FILES-$(CONFIG_DXA_DECODER) +=dxa.cAVCODEC_C_FILES-$(CONFIG_EAC3_DECODER) += eac3dec.ceac3dec_data.cAVCODEC_C_FILES-$(CONFIG_EAC3_ENCODER) +=eac3enc.c ac3enc.c ac3enc_float.c \ ac3tab.c ac3.c kbdwin.cAVCODEC_C_FILES-$(CONFIG_EACMV_DECODER) +=eacmv.cAVCODEC_C_FILES-$(CONFIG_EAMAD_DECODER) += eamad.c eaidct.c mpeg12.c \ mpeg12data.c mpegvideo.c \error_resilience.cAVCODEC_C_FILES-$(CONFIG_EATGQ_DECODER)+= eatgq.c eaidct.cAVCODEC_C_FILES-$(CONFIG_EATGV_DECODER) += eatgv.cAVCODEC_C_FILES-$(CONFIG_EATQI_DECODER) +=eatqi.c eaidct.c mpeg12.c \ mpeg12data.c mpegvideo.c \ error_resilience.cAVCODEC_C_FILES-$(CONFIG_EIGHTBPS_DECOD ER) +=8bps.cAVCODEC_C_FILES-$(CONFIG_EIGHTSVX_EXP_DECODER) +=8svx.cAVCODEC_C_FILES-$(CONFIG_EIGHTSVX_FIB_DECODER) +=8svx.cAVCODEC_C_FILES-$(CONFIG_EIGHTSVX_RAW_DECODER) +=8svx.cAVCODEC_C_FILES-$(CONFIG_ESCAPE124_DECODER) +=escape124.cAVCODEC_C_FILES-$(CONFIG_FFV1_DECODER) +=ffv1.c rangecoder.cAVCODEC_C_FILES-$(CONFIG_FFV1_ENCODER) += ffv1.crangecoder.cAVCODEC_C_FILES-$(CONFIG_FFVHUFF_DECODER) += huffyuv.cAVCODEC_C_FILES-$(CONFIG_FFVHUFF_ENCODER) += huffyuv.cAVCODEC_C_FILES-$(CONFIG_FLAC_DECODER) +=flacdec.c flacdata.c flac.cvorbis_data.cAVCODEC_C_FILES-$(CONFIG_FLAC_ENCODER) += flacenc.c flacdata.c flac.cvorbis_data.cAVCODEC_C_FILES-$(CONFIG_FLASHSV_DECODER) += flashsv.cAVCODEC_C_FILES-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.cAVCODEC_C_FILES-$(CONFIG_FLASHSV2_ENCODER) += flashsv2enc.cAVCODEC_C_FILES-$(CONFIG_FLIC_DECODER) += flicvideo.cAVCODEC_C_FILES-$(CONFIG_FOURXM_DECODER) +=4xm.cAVCODEC_C_FILES-$(CONFIG_FRAPS_DECODER) +=fraps.cAVCODEC_C_FILES-$(CONFIG_FRWU_DECODER) +=frwu.cAVCODEC_C_FILES-$(CONFIG_GIF_DECODER) += gifdec.c lzw.cAVCODEC_C_FILES-$(CONFIG_GIF_ENCODER) += gif.clzwenc.cAVCODEC_C_FILES-$(CONFIG_GSM_DECODER) += gsmdec.c gsmdec_data.cmsgsmdec.cAVCODEC_C_FILES-$(CONFIG_GSM_MS_DECODER) += gsmdec.c gsmdec_data.cmsgsmdec.cAVCODEC_C_FILES-$(CONFIG_H261_DECODER) +=h261dec.c h261.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_H261_ENCODER)+= h261enc.c h261.c \ mpegvideo_enc.c motion_est.c \ ratecontrol.c mpeg12data.c \mpegvideo.cAVCODEC_C_FILES-$(CONFIG_H263_DECODER) +=h263dec.c h263.c ituh263dec.c \ mpeg4video.cmpeg4videodec.c flvdec.c\ intelh263dec.c mpegvideo.c \ error_resilience.cAVCODEC_C_FILES-$(CONFIG_H263_VAAPI_HWA CCEL) +=vaapi_mpeg4.cAVCODEC_C_FILES-$(CONFIG_H263_ENCODER) += mpegvideo_enc.c mpeg4video.c \ mpeg4videoenc.cmotion_est.c \ ratecontrol.c h263.c ituh263enc.c \flvenc.c mpeg12data.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_H264_DECODER)+= h264.c \ h264_loopfilter.c h264_direct.c \ cabac.c h264_sei.c h264_ps.c \ h264_refs.c h264_cavlc.ch264_cabac.c\ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_H264_DXVA2_HWA CCEL) +=dxva2_h264.cAVCODEC_C_FILES-$(CONFIG_H264_VAAPI_HWACCEL)+= vaapi_h264.cAVCODEC_C_FILES-$(CONFIG_HUFFYUV_DECODER)+= huffyuv.cAVCODEC_C_FILES-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.cAVCODEC_C_FILES-$(CONFIG_IDCIN_DECODER) += idcinvideo.cAVCODEC_C_FILES-$(CONFIG_IFF_BYTERUN1_DECODER) += iff.cAVCODEC_C_FILES-$(CONFIG_IFF_ILBM_DECODER) +=iff.cAVCODEC_C_FILES-$(CONFIG_IMC_DECODER) +=imc.cAVCODEC_C_FILES-$(CONFIG_INDEO2_DECODER) +=indeo2.cAVCODEC_C_FILES-$(CONFIG_INDEO3_DECODER) +=indeo3.cAVCODEC_C_FILES-$(CONFIG_INDEO5_DECODER) +=indeo5.c ivi_common.civi_dsp.cAVCODEC_C_FILES-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.cAVCODEC_C_FILES-$(CONFIG_INTERPLAY_VIDEO_DECODER) +=interplayvideo.cAVCODEC_C_FILES-$(CONFIG_JPEG2000_DECODER) += j2kdec.c mqcdec.c mqc.c j2k.cj2k_dwt.cAVCODEC_C_FILES-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.c jpegls.c \ mjpegdec.cmjpeg.cAVCODEC_C_FILES-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.c jpegls.cAVCODEC_C_FILES-$(CONFIG_JV_DECODER)+= jvdec.cAVCODEC_C_FILES-$(CONFIG_KGV1_DECODER) +=kgv1dec.cAVCODEC_C_FILES-$(CONFIG_KMVC_DECODER) +=kmvc.cAVCODEC_C_FILES-$(CONFIG_LAGARITH_DECODER) += lagarith.clagarithrac.cAVCODEC_C_FILES-$(CONFIG_LJPEG_ENCODER) += ljpegenc.c mjpegenc.c mjpeg.c \ mpegvideo_enc.cmotion_est.c \ ratecontrol.c mpeg12data.c \ mpegvideo.cAVCODEC_C_FILES-$(CONFIG_LOCO_DECODER) +=loco.cAVCODEC_C_FILES-$(CONFIG_MACE3_DECODER) +=mace.cAVCODEC_C_FILES-$(CONFIG_MACE6_DECODER) +=mace.cAVCODEC_C_FILES-$(CONFIG_MDEC_DECODER) += mdec.c mpeg12.c mpeg12data.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_MIMIC_DECODER) += mimic.cAVCODEC_C_FILES-$(CONFIG_MJPEG_DECODER) += mjpegdec.c mjpeg.cAVCODEC_C_FILES-$(CONFIG_MJPEG_ENCODER) += mjpegenc.c mjpeg.c \ mpegvideo_enc.c motion_est.c \ ratecontrol.c mpeg12data.c \mpegvideo.cAVCODEC_C_FILES-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.c mjpegdec.cmjpeg.cAVCODEC_C_FILES-$(CONFIG_MLP_DECODER) += mlpdec.c mlpdsp.cAVCODEC_C_FILES-$(CONFIG_MMVIDEO_DECODER) += mmvideo.cAVCODEC_C_FILES-$(CONFIG_MOTIONPIXELS_DECODER) += motionpixels.cAVCODEC_C_FILES-$(CONFIG_MP1_DECODER) += mpegaudiodec.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP1FLOAT_DECODER) += mpegaudiodec_float.c mpegaudiodecheader.c \ mpegaudio.cmpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP2_DECODER) += mpegaudiodec.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP2_ENCODER) += mpegaudioenc.c mpegaudio.c \mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP2FLOAT_DECODER) += mpegaudiodec_float.c mpegaudiodecheader.c \ mpegaudio.cmpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP3ADU_DECODER) += mpegaudiodec.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP3ADUFLOAT_DECOD ER) += mpegaudiodec_float.c mpegaudiodecheader.c \ mpegaudio.cmpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP3ON4_DECODER) += mpegaudiodec.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.c \mpeg4audio.cAVCODEC_C_FILES-$(CONFIG_MP3ON4FLOAT_DECODER) += mpegaudiodec_float.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.c \mpeg4audio.cAVCODEC_C_FILES-$(CONFIG_MP3_DECODER) += mpegaudiodec.c mpegaudiodecheader.c \ mpegaudio.c mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MP3FLOAT_DECODER) += mpegaudiodec_float.c mpegaudiodecheader.c \ mpegaudio.cmpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MPC7_DECODER) += mpc7.c mpc.c mpegaudiodec.c \ mpegaudiodecheader.c mpegaudio.c \mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MPC8_DECODER) += mpc8.c mpc.c mpegaudiodec.c \ mpegaudiodecheader.c mpegaudio.c \mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_MPEGVIDEO_DECODER ) += mpeg12.c mpeg12data.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_MPEG_XVMC_DECO DER) +=mpegvideo_xvmc.cAVCODEC_C_FILES-$(CONFIG_MPEG1VIDEO_DECODER) += mpeg12.c mpeg12data.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_MPEG1VIDEO_ENC ODER) += mpeg12enc.c mpegvideo_enc.c \ motion_est.c ratecontrol.c \ mpeg12.c mpeg12data.c \ mpegvideo.c error_resilience.cAVCODEC_C_FILES-$(CONFIG_MPEG2_DXVA2_HW ACCEL) +=dxva2_mpeg2.cAVCODEC_C_FILES-$(CONFIG_MPEG2_VAAPI_HWACCEL ) +=vaapi_mpeg2.cAVCODEC_C_FILES-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12.c mpeg12data.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_MPEG2VIDEO_ENC ODER) += mpeg12enc.c mpegvideo_enc.c \ motion_est.c ratecontrol.c \ mpeg12.c mpeg12data.c \ mpegvideo.c error_resilience.cAVCODEC_C_FILES-$(CONFIG_MPEG4_VAAPI_HW ACCEL) +=vaapi_mpeg4.cAVCODEC_C_FILES-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.cmsmpeg4data.cAVCODEC_C_FILES-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.c msmpeg4data.c h263dec.c \ h263.c ituh263dec.c mpeg4videodec.cAVCODEC_C_FILES-$(CONFIG_MSMPEG4V2_ENCODER ) += msmpeg4.c msmpeg4data.c h263dec.c \ h263.cituh263dec.cmpeg4videodec.cAVCODEC_C_FILES-$(CONFIG_MSMPEG4V3_DECODER ) += msmpeg4.c msmpeg4data.c h263dec.c \ h263.cituh263dec.cmpeg4videodec.cAVCODEC_C_FILES-$(CONFIG_MSMPEG4V3_ENCODER ) += msmpeg4.c msmpeg4data.c h263dec.c \ h263.cituh263dec.cmpeg4videodec.cAVCODEC_C_FILES-$(CONFIG_MSRLE_DECODER) += msrle.cmsrledec.cAVCODEC_C_FILES-$(CONFIG_MSVIDEO1_DECODER) += msvideo1.cAVCODEC_C_FILES-$(CONFIG_MSVIDEO1_ENCODER) += msvideo1enc.c elbg.cAVCODEC_C_FILES-$(CONFIG_MSZH_DECODER) += lcldec.cAVCODEC_C_FILES-$(CONFIG_MXPEG_DECODER) += mxpegdec.c mjpegdec.cmjpeg.cAVCODEC_C_FILES-$(CONFIG_NELLYMOSER_DECODER) += nellymoserdec.cnellymoser.cAVCODEC_C_FILES-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.cnellymoser.cAVCODEC_C_FILES-$(CONFIG_NUV_DECODER) += nuv.c rtjpeg.cAVCODEC_C_FILES-$(CONFIG_PAM_DECODER) += pnmdec.c pnm.cAVCODEC_C_FILES-$(CONFIG_PAM_ENCODER) += pamenc.c pnm.cAVCODEC_C_FILES-$(CONFIG_PBM_DECODER) += pnmdec.c pnm.cAVCODEC_C_FILES-$(CONFIG_PBM_ENCODER) += pnmenc.cpcx.cAVCODEC_C_FILES-$(CONFIG_PCX_ENCODER) +=pcxenc.cAVCODEC_C_FILES-$(CONFIG_PGM_DECODER) += pnmdec.c pnm.cAVCODEC_C_FILES-$(CONFIG_PGM_ENCODER) += pnmenc.c pnm.cAVCODEC_C_FILES-$(CONFIG_PGMYUV_DECODER) += pnmdec.c pnm.cAVCODEC_C_FILES-$(CONFIG_PGMYUV_ENCODER) += pnmenc.c pnm.cAVCODEC_C_FILES-$(CONFIG_PGSSUB_DECODER) += pgssubdec.cAVCODEC_C_FILES-$(CONFIG_PICTOR_DECODER) += pictordec.ccga_data.cAVCODEC_C_FILES-$(CONFIG_PNG_DECODER) += png.c pngdec.cAVCODEC_C_FILES-$(CONFIG_PNG_ENCODER) += png.c pngenc.cAVCODEC_C_FILES-$(CONFIG_PPM_DECODER) += pnmdec.c pnm.cAVCODEC_C_FILES-$(CONFIG_PPM_ENCODER) += pnmenc.c pnm.cAVCODEC_C_FILES-$(CONFIG_PTX_DECODER) +=ptx.cAVCODEC_C_FILES-$(CONFIG_QCELP_DECODER) += qcelpdec.c celp_math.c \ celp_filters.c acelp_vectors.c \acelp_filters.cAVCODEC_C_FILES-$(CONFIG_QDM2_DECODER) += qdm2.c mpegaudiodec.c \ mpegaudiodecheader.c mpegaudio.c \mpegaudiodata.cAVCODEC_C_FILES-$(CONFIG_QDRAW_DECODER) += qdrw.cAVCODEC_C_FILES-$(CONFIG_QPEG_DECODER) +=qpeg.cAVCODEC_C_FILES-$(CONFIG_QTRLE_DECODER) +=qtrle.cAVCODEC_C_FILES-$(CONFIG_QTRLE_ENCODER) +=qtrleenc.cAVCODEC_C_FILES-$(CONFIG_R10K_DECODER) +=r210dec.cAVCODEC_C_FILES-$(CONFIG_R210_DECODER) +=r210dec.cAVCODEC_C_FILES-$(CONFIG_RA_144_DECODER) +=ra144dec.c ra144.ccelp_filters.cAVCODEC_C_FILES-$(CONFIG_RA_144_ENCODER) += ra144enc.c ra144.ccelp_filters.cAVCODEC_C_FILES-$(CONFIG_RA_288_DECODER) += ra288.c celp_math.ccelp_filters.cAVCODEC_C_FILES-$(CONFIG_RAWVIDEO_DECODER) += rawdec.cAVCODEC_C_FILES-$(CONFIG_RAWVIDEO_ENCODER) += rawenc.cAVCODEC_C_FILES-$(CONFIG_RL2_DECODER) +=rl2.cAVCODEC_C_FILES-$(CONFIG_ROQ_DECODER) +=roqvideodec.croqvideo.cAVCODEC_C_FILES-$(CONFIG_ROQ_ENCODER) += roqvideoenc.c roqvideo.celbg.cAVCODEC_C_FILES-$(CONFIG_ROQ_DPCM_DECODER) +=dpcm.cAVCODEC_C_FILES-$(CONFIG_ROQ_DPCM_ENCODER) += roqaudioenc.cAVCODEC_C_FILES-$(CONFIG_RPZA_DECODER) += rpza.cAVCODEC_C_FILES-$(CONFIG_RV10_DECODER) +=rv10.cAVCODEC_C_FILES-$(CONFIG_RV10_ENCODER) +=rv10enc.cAVCODEC_C_FILES-$(CONFIG_RV20_DECODER) +=rv20enc.cAVCODEC_C_FILES-$(CONFIG_RV30_DECODER) += rv30.crv34.c rv30dsp.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_RV40_DECODER)+= rv40.c rv34.c rv40dsp.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_S302M_DECODER)+= s302m.cAVCODEC_C_FILES-$(CONFIG_SGI_DECODER) +=sgidec.cAVCODEC_C_FILES-$(CONFIG_SGI_ENCODER) += sgienc.c rle.cAVCODEC_C_FILES-$(CONFIG_SHORTEN_DECODER) +=shorten.cAVCODEC_C_FILES-$(CONFIG_SIPR_DECODER) += sipr.c acelp_pitch_delay.c \ celp_math.c acelp_vectors.c \ acelp_filters.c celp_filters.c \sipr16k.cAVCODEC_C_FILES-$(CONFIG_SMACKAUD_DECODER) += smacker.cAVCODEC_C_FILES-$(CONFIG_SMACKER_DECODER) += smacker.cAVCODEC_C_FILES-$(CONFIG_SMC_DECODER) +=smc.cAVCODEC_C_FILES-$(CONFIG_SNOW_DECODER) += snow.c rangecoder.cAVCODEC_C_FILES-$(CONFIG_SNOW_ENCODER) +=snow.c rangecoder.c motion_est.c \ ratecontrol.c h263.c \ mpegvideo.c error_resilience.c \ ituh263enc.cmpegvideo_enc.c \mpeg12data.cAVCODEC_C_FILES-$(CONFIG_SOL_DPCM_DECODER) += dpcm.cAVCODEC_C_FILES-$(CONFIG_SONIC_DECODER) +=sonic.cAVCODEC_C_FILES-$(CONFIG_SONIC_ENCODER) +=sonic.cAVCODEC_C_FILES-$(CONFIG_SONIC_LS_ENCODER) +=sonic.cAVCODEC_C_FILES-$(CONFIG_SP5X_DECODER) += sp5xdec.c mjpegdec.c mjpeg.cAVCODEC_C_FILES-$(CONFIG_SRT_DECODER) += srtdec.c ass.cAVCODEC_C_FILES-$(CONFIG_SRT_ENCODER) += srtenc.cass_split.cAVCODEC_C_FILES-$(CONFIG_SUNRAST_DECODER) += sunrast.cAVCODEC_C_FILES-$(CONFIG_SVQ1_DECODER) +=svq1dec.c svq1.c h263.c \ mpegvideo.cerror_resilience.cAVCODEC_C_FILES-$(CONFIG_SVQ1_ENCODER)+= svq1enc.c svq1.c \ motion_est.c h263.c \ mpegvideo.c error_resilience.c \ ituh263enc.c mpegvideo_enc.c \ ratecontrol.cmpeg12data.cAVCODEC_C_FILES-$(CONFIG_SVQ3_DECODER) +=h264.c svq3.c \ h264_loopfilter.c h264_direct.c \h264_sei.c h264_ps.c h264_refs.c \ h264_cavlc.ch264_cabac.c cabac.c \ mpegvideo.c error_resilience.c \ svq1dec.c svq1.ch263.cAVCODEC_C_FILES-$(CONFIG_TARGA_DECODER) +=targa.cAVCODEC_C_FILES-$(CONFIG_TARGA_ENCODER) +=targaenc.c rle.cAVCODEC_C_FILES-$(CONFIG_THEORA_DECODER)+= xiph.cAVCODEC_C_FILES-$(CONFIG_THP_DECODER) +=mjpegdec.cmjpeg.cAVCODEC_C_FILES-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.cAVCODEC_C_FILES-$(CONFIG_TIFF_DECODER) += tiff.c lzw.cfaxcompr.cAVCODEC_C_FILES-$(CONFIG_TIFF_ENCODER) += tiffenc.c rle.clzwenc.cAVCODEC_C_FILES-$(CONFIG_TMV_DECODER) += tmv.ccga_data.cAVCODEC_C_FILES-$(CONFIG_TRUEMOTION1_DECODER) += truemotion1.cAVCODEC_C_FILES-$(CONFIG_TRUEMOTION2_DECODER ) +=truemotion2.cAVCODEC_C_FILES-$(CONFIG_TRUESPEECH_DECODER) += truespeech.cAVCODEC_C_FILES-$(CONFIG_TSCC_DECODER) += tscc.c msrledec.cAVCODEC_C_FILES-$(CONFIG_TTA_DECODER) += tta.cAVCODEC_C_FILES-$(CONFIG_TWINVQ_DECODER) += twinvq.c celp_math.cAVCODEC_C_FILES-$(CONFIG_TXD_DECODER) += txd.c s3tc.cAVCODEC_C_FILES-$(CONFIG_ULTI_DECODER) +=ulti.cAVCODEC_C_FILES-$(CONFIG_V210_DECODER) +=v210dec.cAVCODEC_C_FILES-$(CONFIG_V210_ENCODER) +=v210enc.cAVCODEC_C_FILES-$(CONFIG_V210X_DECODER) +=v210x.cAVCODEC_C_FILES-$(CONFIG_VB_DECODER) +=vb.cAVCODEC_C_FILES-$(CONFIG_VC1_DECODER) += vc1dec.c vc1.c vc1data.c vc1dsp.c \ msmpeg4.c msmpeg4data.c \intrax8.cintrax8dsp.cAVCODEC_C_FILES-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.cAVCODEC_C_FILES-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.cAVCODEC_C_FILES-$(CONFIG_VCR1_DECODER) +=vcr1.cAVCODEC_C_FILES-$(CONFIG_VCR1_ENCODER) +=vcr1.cAVCODEC_C_FILES-$(CONFIG_VMDAUDIO_DECODER) += vmdav.cAVCODEC_C_FILES-$(CONFIG_VMDVIDEO_DECODER) += vmdav.cAVCODEC_C_FILES-$(CONFIG_VMNC_DECODER) +=vmnc.cAVCODEC_C_FILES-$(CONFIG_VORBIS_DECODER) += vorbisdec.c vorbis.c \ vorbis_data.cxiph.cAVCODEC_C_FILES-$(CONFIG_VORBIS_ENCODER) += vorbisenc.c vorbis.c \vorbis_data.cAVCODEC_C_FILES-$(CONFIG_VP3_DECODER) +=vp3.c vp3dsp.cAVCODEC_C_FILES-$(CONFIG_VP5_DECODER) +=vp5.c vp56.c vp56data.c vp56dsp.c \ vp3dsp.cvp56rac.cAVCODEC_C_FILES-$(CONFIG_VP6_DECODER) += vp6.cvp56.c vp56data.c vp56dsp.c \ vp3dsp.c vp6dsp.cvp56rac.cAVCODEC_C_FILES-$(CONFIG_VP8_DECODER) += vp8.cvp8dsp.c vp56rac.cAVCODEC_C_FILES-$(CONFIG_VQA_DECODER) += vqavideo.cAVCODEC_C_FILES-$(CONFIG_WAVPACK_DECODER) += wavpack.cAVCODEC_C_FILES-$(CONFIG_WMAPRO_DECODER) += wmaprodec.c wma.cAVCODEC_C_FILES-$(CONFIG_WMAV1_DECODER)+= wmadec.c wma.caactab.cAVCODEC_C_FILES-$(CONFIG_WMAV1_ENCODER) += wmaenc.c wma.caactab.cAVCODEC_C_FILES-$(CONFIG_WMAV2_DECODER) += wmadec.c wma.caactab.cAVCODEC_C_FILES-$(CONFIG_WMAV2_ENCODER) += wmaenc.c wma.caactab.cAVCODEC_C_FILES-$(CONFIG_WMAVOICE_DECODER) += wmavoice.c \ celp_math.c celp_filters.c \acelp_vectors.cacelp_filters.cAVCODEC_C_FILES-$(CONFIG_WMV1_DECODER) += msmpeg4.cmsmpeg4data.cAVCODEC_C_FILES-$(CONFIG_WMV2_DECODER) += wmv2dec.c wmv2.c \ msmpeg4.c msmpeg4data.c \ intrax8.c intrax8dsp.cAVCODEC_C_FILES-$(CONFIG_WMV2_ENCODER) +=wmv2enc.c wmv2.c \ msmpeg4.c msmpeg4data.c \mpeg4videodec.c ituh263dec.ch263dec.cAVCODEC_C_FILES-$(CONFIG_WNV1_DECODER) +=wnv1.cAVCODEC_C_FILES-$(CONFIG_WS_SND1_DECODER) +=ws-snd1.cAVCODEC_C_FILES-$(CONFIG_XAN_DPCM_DECODER) += dpcm.cAVCODEC_C_FILES-$(CONFIG_XAN_WC3_DECODER) +=xan.cAVCODEC_C_FILES-$(CONFIG_XAN_WC4_DECODER) +=xxan.cAVCODEC_C_FILES-$(CONFIG_XL_DECODER) +=xl.cAVCODEC_C_FILES-$(CONFIG_XSUB_DECODER) +=xsubdec.cAVCODEC_C_FILES-$(CONFIG_XSUB_ENCODER) += xsubenc.cAVCODEC_C_FILES-$(CONFIG_YOP_DECODER) +=yop.cAVCODEC_C_FILES-$(CONFIG_ZLIB_DECODER) +=lcldec.cAVCODEC_C_FILES-$(CONFIG_ZLIB_ENCODER) +=lclenc.cAVCODEC_C_FILES-$(CONFIG_ZMBV_DECODER) +=zmbv.cAVCODEC_C_FILES-$(CONFIG_ZMBV_ENCODER) += zmbvenc.c AVCODEC_C_FILES-$(CONFIG_PCM_ALAW_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_ALAW_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_BLURAY_DECODER) +=pcm-mpeg.cAVCODEC_C_FILES-$(CONFIG_PCM_DVD_DECODER) += pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_DVD_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F32BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F32BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F32LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F32LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F64BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F64BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F64LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_F64LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_LXF_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_MULAW_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_MULAW_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S8_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S8_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S16BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S16BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S16LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S16LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S16LE_PLANAR_DECODER) += pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24DAUD_DECODER) += pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24DAUD_ENCODER) += pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S24LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S32BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S32BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S32LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_S32LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U8_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U8_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U16BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U16BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U16LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U16LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U24BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U24BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U24LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U24LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U32BE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U32BE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U32LE_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_U32LE_ENCODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_ZORK_DECODER) +=pcm.cAVCODEC_C_FILES-$(CONFIG_PCM_ZORK_ENCODER) += pcm.c AVCODEC_C_FILES-$(CONFIG_ADPCM_4XM_DECODER) +=adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.cAVCODEC_C_FILES-$(CONFIG_ADPCM_ADX_ENCODER) += adxenc.cAVCODEC_C_FILES-$(CONFIG_ADPCM_CT_DECODER) += adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_EA_DECODER) += adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_EA_MAXIS_XA_DECODER ) += adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_EA_R1_DECODER) += adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_EA_R2_DECODER) += adpcm.cAVCODEC_C_FILES-$(CONFIG_ADPCM_EA_R3_DECODER) +=。

相关文档
最新文档