首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用MediaCodec和MediaExtractor播放视频和音频

在Android开发中,使用MediaCodecMediaExtractor来播放视频和音频是一种比较底层的方法,它可以给你更多的控制权,比如处理非标准的媒体格式或者实现特殊的播放效果。下面是一个基本的步骤和代码示例,帮助你理解如何使用这两个类来播放媒体文件。

步骤 1: 使用 MediaExtractor 提取媒体数据

MediaExtractor 可以从多种来源(如文件或网络流)中分离视频和音频轨道。

代码语言:javascript
复制
MediaExtractor extractor = new MediaExtractor();
try {
    // 设置数据源
    extractor.setDataSource(filePath);

    int trackCount = extractor.getTrackCount();
    int videoTrackIndex = -1;
    int audioTrackIndex = -1;

    // 查找视频轨和音频轨
    for (int i = 0; i < trackCount; i++) {
        MediaFormat format = extractor.getTrackFormat(i);
        String mime = format.getString(MediaFormat.KEY_MIME);
        if (mime.startsWith("video/")) {
            videoTrackIndex = i;
        } else if (mime.startsWith("audio/")) {
            audioTrackIndex = i;
        }
    }

    if (videoTrackIndex == -1 || audioTrackIndex == -1) {
        throw new IllegalArgumentException("No video or audio track found in file");
    }

    // 选择轨道
    extractor.selectTrack(videoTrackIndex);
    // 可以选择性地处理音频轨道
} catch (IOException e) {
    e.printStackTrace();
}

步骤 2: 使用 MediaCodec 解码媒体数据

MediaCodec 用于解码视频和音频数据。

代码语言:javascript
复制
// 创建解码器
MediaCodec videoCodec = MediaCodec.createDecoderByType(videoMime);
videoCodec.configure(videoFormat, surface, null, 0);
videoCodec.start();

// 缓冲区处理
ByteBuffer[] inputBuffers = videoCodec.getInputBuffers();
ByteBuffer[] outputBuffers = videoCodec.getOutputBuffers();

while (!eosReceived) {
    int inIndex = videoCodec.dequeueInputBuffer(10000);
    if (inIndex >= 0) {
        ByteBuffer buffer = inputBuffers[inIndex];
        // 从extractor读取数据到buffer中
        int sampleSize = extractor.readSampleData(buffer, 0);
        if (sampleSize < 0) {
            // 数据读取完毕
            videoCodec.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
            eosReceived = true;
        } else {
            videoCodec.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime(), 0);
            extractor.advance();
        }
    }

    // 获取解码后的数据
    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
    int outIndex = videoCodec.dequeueOutputBuffer(info, 10000);
    switch (outIndex) {
        case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
            outputBuffers = videoCodec.getOutputBuffers();
            break;
        case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
            // Subsequent data will conform to new format.
            break;
        case MediaCodec.INFO_TRY_AGAIN_LATER:
            // No output available yet
            break;
        default:
            // 解码成功,使用outputBuffers[outIndex]中的数据
            videoCodec.releaseOutputBuffer(outIndex, true); // Surface作为目标时,设置为true
            break;
    }
}

注意事项

  1. 线程管理:解码过程应该在非UI线程中进行,以避免阻塞UI线程。
  2. 错误处理:应该添加必要的错误处理和资源管理代码,确保在发生错误时释放资源。
  3. 同步问题:在实际应用中,音视频同步是一个复杂的问题,需要根据PTS(Presentation Time Stamp)来调整音视频的播放。

这只是一个基本的框架,实际应用中可能需要更复杂的处理,比如处理不同格式的兼容性问题、动态输入源的处理等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用MediaCodec解码音视频

播放一个音视频文件的时候,我们知道需要经过解协议->解封装->解码音频/视频->音频/视频同步->渲染播放这几个步骤,其中解码音频/视频是整个流程中最核心的一个环节.每个步骤的详细解释可以参考上篇文章Android...中如何使用OpenGL播放视频 Android平台下解码音视频可以采用软件解码如ffmpeg,或使用硬件解码如MediaCodec来实现软件解码:利用CPU进行解码处理,这种方式会加大CPU负担并增加功耗...,必须调用release方法释放相关资源 MediaExtractor简介 在使用MediaCodec解码音频/视频的时候,首先需要获取编码后的音频/视频数据....这里我们引入MediaExtractor,它可以分离mp4,flv生成视频h264/mpeg音频mp3或aac(无adts头) MediaExtractor的用法很简单,参考官方文档的举例即可 ?...,及时释放资源 videoCodec.release() 解码音频解码音频的步骤和解码视频的步骤是类似的,此处就不再赘述了,如果想要播放解码出来的音频PCM数据,可以使用AudioTrack,详情可以参考

2.4K20
  • Android FFmpeg + MediaCodec 实现视频硬解码

    前面 FFmpeg 系列的文章中,已经实现了音视频播放、录制、添加滤镜等功能: Android FFmpeg 流媒体边播放边录制功能 FFmpeg 实现带滤镜的微信小视频录制功能 FFmpeg + OpenGL...ES 实现 3D 全景播放器 本文将利用 FFmpeg+ MediaCodec 做一个播放器,实现视频的硬解码视频同步等功能。...,通常 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, SurfaceAudioTrack 一起使用。...本文将实现 FFmpeg AMediaCodec 结合使用, FFmpeg 负责解复用音频解码,MediaCodec 负责视频解码并输出到 Surface(ANativeWindow)对象,其中解复用...在一个线程中解复用,分别将音频视频的编码数据包放入 2 个队列。

    3.5K20

    AVPlayer 添加音频播放功能

    在上篇文章 使用AudioTrack播放音频轨道 中我们使用 AudioTrack 播放视频音轨数据。本篇文章中我们将为 AVPlayer 添加音效,并实现音视频同步。...本期内容: 封装解码器代码 实现音视频同步 结束语 02 封装解码器代码 首先,我们对 DemoMediaPlayerActivity 进行改造,将解码器相关代码进行封装,以便音频解码可以完美复用。...03 实现音视频同步 音视频同步通常有三种方式:一种是参考视频,第二种是参考音频,第三种时互相参考。我们示例 demo 使用的为第一种第二种,音视频自身完成同步。...说简单点音视频同步就是根据帧的显示时间,对解码线程进行锁定,已达到视频同步效果。...现在我们整合 AVAssetTrackDecoder 及 AVMediaSyncClock 实现完整播放器功能。

    2.1K40

    Android音频编辑之音频转换PCM与WAV

    使用MP3播放器对MP3文件进行实时的解压缩(解码),这样,高品质的MP3音乐就播放出来了。 补充:最高比特率320K,高频部分一刀切是他的缺点。音质不高!...这种压缩与Zip的方式类似,但是FLAC将给你更大的压缩比率,因为FLAC是专门针对音频的特点设计的压缩方式,并且你可以使用播放播放FLAC压缩的文件,就象通常播放你的MP3文件一样。...WAV也可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,AVI一样,只要安装好了相应的Decode...然后创建了MediaCodec用于后续MediaExtractor一起进行音频的解码操作。... mediaExtractor if (mediaCodec !

    6K30

    Android中音视频合成的几种方案详析

    前言 最近工作中遇到了音视频处理的需求,Android下音视频合成,在当前调研方案中主要有三大类方法:MediaMux硬解码,mp4parser,FFmepg。...三种方法均可实现,但是也有不同的局限问题,先将实现问题记录于此,便于之后的总结学习。下面话不多说了,来一起看看详细的介绍吧。 方法一(Fail) 利用MediaMux实现音视频的合成。...效果:可以实现音视频的合并,利用Android原生的VideoViewSurfaceView播放正常,大部分的播放器也播放正常,但是,但是,在上传Youtube就会出现问题:音频不连续,分析主要是上传...Youtube时会被再次的压缩,可能在压缩的过程中出现音频的帧率出现问题。...分析:在MediaCodec.BufferInfo的处理中,时间戳presentationTimeUs出现问题,导致Youtube的压缩造成音频的紊乱。

    1.7K10

    MediaCodec进行AAC编解码(文件格式转换)

    在介绍AAC编解码之前,首先要先学习几个新知识MediaExtractorADTS格式 仓库源码FFmpegSample,对应版本代码v1.6 MediaExtractor 前面在介绍视频编码的时候使用到了...下面要介绍另外一个类MediaExtractor:负责将指定类型的媒体文件从文件中找到轨道,可以用来分离容器中的视频track音频track。将得到的原始数据解析成解码器需要的数据。 ?...当你编码AAC裸流的时候,会遇到写出来的AAC文件并不能在PC手机上播放,很大的可能就是AAC文件的每一帧里缺少了ADTS头信息文件的包装拼接。只需要加入头文件ADTS即可。...try { mediaExtractor = new MediaExtractor();//此类可分离视频文件的音轨视频轨道 mediaExtractor.setDataSource...使用MediaExtractor.readSampleData读取文件音频数据,然后交给MediaCodec进行解码,最后将得到的PCM数据加入队列中 这里队列我们使用ArrayBlockingQueue

    2K50

    使用 AudioTrack 播放音频轨道

    在上篇文章 OpenGL ES 实现播放视频帧 中我们已经知道如何使用 GLSurfaceView 将解码后的视频渲染到屏幕上,但是,我们的播放器还不具备音频播放的功能,在本篇文章中我们将使用 AudioTrack...本期内容: PCM 介绍 AudioTrack API 介绍 使用 MediaCodec 解码及播放音频轨道 结束语 02 PCM 介绍 PCM (Pulse-code modulation 脉冲编码调制...03 AudioTrack API 介绍 在 Android 中,如果你想要播放一个音频文件,我们一般优先选用 MediaPlayer,使用 MediaPlayer 时你不需要关心文件的具体格式,也不需要对文件进行解码...,使用 MediaPlayer 提供的 API,我们就可以开发出一个简单的音频播放器。...04 MediaCodec 解码并播放音频轨道 如果我们要播放一个音频轨道,需要将音轨解码后才可以播放,之前我们一直在说如何解码视频,如果你看过 AVPlayer Demo ,你一定对如何创建视频轨道解码器很熟悉了

    2.1K31

    Android AVDemo(4):音频解封装,从 MP4 中解封装出 AAC丨音视频工程示例

    → 编码 → 封装 → 解封装 → 解码 → 渲染过程,并借助音视频工具来分析理解对应的音视频数据。...这个 Demo 里包含以下内容: 1)实现一个音频解封装模块; 2)实现对 MP4 文件中音频部分的解封装逻辑并将解封装后的编码数据存储为 AAC 文件; 3)详尽的代码注释,帮你理解代码逻辑原理。...这样设计是因为这个配置类不仅会用于音频解封装,后续的视频解封装也会使用。...3、用工具播放 AAC 文件 完成音频采集编码后,可以将 sdcard 文件夹下面的 test.aac 文件拷贝到电脑上,使用 ffplay 播放来验证一下音频采集是效果是否符合预期: $ ffplay...-i test.aac 关于播放 AAC 文件的工具,可以参考《FFmpeg 工具》第 2 节 ffplay 命令行工具《可视化音视频分析工具》第 1.1 节 Adobe Audition。

    1.1K30

    干货 | 移动端使用OpenGL转场特效的音视频合成应用

    这样的视频其实一般是由音频视频组成的音视频容器。下面先会介绍音视频相关概念,为音视频技术的应用作一个铺垫,希望能对音视频频开发者提供一些帮助。...1.4 音频编码 视频编码一样,音频也有许多的编码格式,如:WAV、MP3、WMA、APE、FLAC等等。...专门针对PCM音频的特点设计的压缩方式,而且可以使用播放器直接播放FLAC压缩的文件 免费,支持大多数操作系统 二、使用OpenGL的底层转场特效原生平台硬编码进行图片、音乐、转场合成视频需要哪些...在进行视频编辑时,可以利用MediaExtractor来提取指定的音频信息,封装到目标音视频文件中。...mediaExtractor.readSampleData(inputBuffer, 0) //进入下一帧 mediaExtractor.advance() //MediaExtractor读取到的音频数据可以使用

    46911

    Android音频播放(本地网络)绘制数据波形,根据特征有节奏的改变颜色

    改变颜色播放输出波形 Android的音频播放与录制 MediaPlayer、MediaRecord、AudioRecord,这三个都是大家耳目能详的Android多媒体类(= =没听过的也要假装听过...),包含了音视频播放,音视频录制等...但是还有一个被遗弃的熊孩子AudioTrack,这个因为太不好用了而被人过门而不入(反正肯定不是因为懒),这Android上多媒体四大家族就齐了,MediaPlayer...MP3的波形数据提取 当那位小伙提出这个需求的时候,我就想起了AudioTrack这个类,AudioRecord功能的使用方法十分相似,使用的时候初始化好之后对数据的buffer执行write就可以发出呻吟了...但是问题来了,首先AudioTrack只能播放PCM的原始音频文件,那要MP3怎么办?...下面直接看代码吧,都有注释(真的不是懒得讲╮(╯_╰)╭): 流程就是定义好buffer,初始化MediaExtractor来获取数据,MediaCodec对数据进行解码,初始化AudioTrack播放数据

    3.5K20

    【Android 音视频开发打怪升级:音视频硬解码篇】三、音视频播放:音视频同步

    setDataSource(path) 【2.1/2.2,获取音视频多媒体格式】 音频视频是一样的: 1)遍历视频文件中所有的通道,一般是音频视频两个通道; 2) 然后获取对应通道的编码格式,判断是否包含...,拖动进度条释放以后,视频通常会在你释放的位置往前一点 封装音频视频提取器 上面封装的工具中,可以支持音频视频的数据提取,下面我们将利用这个工具,用于分别提取音频视频的数据。...获取参数不一样 音频播放需要获取采样率,通道数,采样位数等 3. 需要初始化一个音频渲染器:AudioTrack 由于解码出来的数据是PCM数据,所以直接使用AudioTrack播放即可。...但是如果你真正把代码跑起来的话,你会发现:视频音频为什么不同步啊,视频就像倍速播放一样,一下就播完了,但是音频却很正常。 这就要引出下一个不可避免的问题了,那就是音视频同步。...五、音视频同步 同步信号来源 由于视频音频是两个独立的任务在运行,视频音频的解码速度也不一样,解码出来的数据也不一定马上就可以显示出来。

    2.4K20

    【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封封装:生成一个MP4

    一、音视频解封 在本篇章的第二篇文章【音视频硬解码流程】,已经讲过,Android使用的是MediaExtractor对音视频数据流进行解封。这里,我们简单再过一遍。...一般使用MP4格式。...() mMuxer.release() Log.i(TAG, "MP4 重打包完成") }.start() } } 首先,定义了音频视频分离器...,以及封装器; 接着,判断要重封装的视频是否包含有音视频数据,没有则忽略相应的轨道; 最后,启动线程,开始解封封装,分为两部分: 音频数据分离写入 视频数据分离写入 其中有一个要注意的就是BufferInfo...】系列文章就结束了,本系列共四篇文章,从【音视频基础知识介绍】->【Android音解码流程】->【音视频播放与同步】->【视频解封与封装】,比较全面的介绍了Android应用系统提供的硬解码能力,实现音视频的解码

    54930

    「音视频直播技术」Android下H264解码

    前言 上一篇文章中我介绍了如何使用MediaCodec编码,今天我们再来分析一下如何通过 MediaCodec 进行解码。 为了讲解的方便,我们引入了 MediaExtractor 类。...它用于打开MP4等媒体文件,并从中抽取出音视频数据。 打开媒体文件 MediaExtractor,音视频数据分离器。...每种媒体文件如MP4, FLV, MOOV等都是一种容器,里边存放了音频数据视频数据。MediaExtractor的作用就是根据容器协议打开容器,并读取其中的音频视频数据。...在容器文件(MP4)中,音频数据与视频数据是以轨道(�track)的概念存放的。取的是两条轨道永远不相交的意思,也就指明音频数据与视频数据是分别存储的。...我们使用MediaExtractor类打开媒体文件,它的使用非常简单,步骤如下: 1. 创建一个MediaExtractor对象。 2. 将媒体文件设置给MediaExtractor对象。 3.

    1.8K20

    Android端的短视频开发,我们该如何快速实现移动端短视频功能?

    二.短视频处理播放 视频的处理播放主要是视频的清晰度、观看流畅度方面的体验。...除了带宽之外,短视频内容的存储CDN优化也尤为重要,通常我们需要上传到云存储服务器的内容是短视频内容封面内容。 而CDN优化带给短视频平台的则是进一步的短视频首次载入循环播放方面的体验。...MediaRecorder:是Android系统直接提供给我们的录制类,用于录制音频视频的一个类,简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放,录制的音频文件是经过压缩的,...需要设置编码器,录制的音频文件可以用系统自带的播放播放。...它们一个是生成视频,一个生成音频,这里把它们结合一下,同时生成音频视频。基本框架流程如下: ? 首先是录音线程,主要参考HWEncoderExperiments。

    2.1K20

    视频源码开发,Android端短视频功能的快速实现

    二、短视频处理播放 视频的处理播放主要是视频的清晰度、观看流畅度方面的体验。...而CDN优化带给短视频源码开发的则是进一步的短视频首次载入循环播放方面的体验。...MediaRecorder:是Android系统直接提供给我们的录制类,用于短视频源码开发录制音频视频的一个类,简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放,录制的音频文件是经过压缩的...MediaCodec+MediaMuxer: MediaCodec 与 MediaMuxer结合使用同样能够实现短视频源码开发录制的功能。...它们一个是生成视频,一个生成音频,这里把它们结合一下,同时生成音频视频。短视频源码开发基本框架流程如下: 首先是录音线程,主要参考HWEncoderExperiments。

    1.1K10

    刷抖音上瘾后,决定探究如果做一款类似抖音短视频app

    二、短视频处理播放 视频的处理播放主要是视频的清晰度、观看流畅度方面的体验。...除了带宽之外,短视频内容的存储CDN优化也尤为重要,通常我们需要上传到云存储服务器的内容是短视频内容封面内容。 而CDN优化带给短视频平台的则是进一步的短视频首次载入循环播放方面的体验。...MediaRecorder:是Android系统直接提供给我们的录制类,用于录制音频视频的一个类,简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放,录制的音频文件是经过压缩的,...需要设置编码器,录制的音频文件可以用系统自带的播放播放。...它们一个是生成视频,一个生成音频,这里把它们结合一下,同时生成音频视频。基本框架流程如下: ? 首先是录音线程,主要参考HWEncoderExperiments。

    2.5K30

    Android用MediaExtractorMediaMuxer合成音视频

    工具准备: 视频的分离合成我主要用到了MediaExtractorMediaMuxer两个类: MediaExtractor是用于提取多路的、通常编码的视频资源的,通过它我们可以选择音频或者视频轨,...然后分别对它们进行操作等; MediaMuxer是用于复用基本流的,用它可以将音频视频合成,目前支持输出MP4,Webm3GP格式的视频,在Android7.0以后支持多路复用帧的MP4。...2.合成: 那么到这里,视频一的音频视频二的视频图像都已经设置给MediaMuxer对象了,我们就可以合成啦,还记得我们在找音频视频的时候记录下的新旧轨道吧,现在通过MediaExtractor对象的...selectTrack(旧轨道)方法选择到原视频的我们想要的音轨或视频轨,并取到样本,设置编码信息,然后通过MediaMuxer对象的 writeSampleData(新轨道,样本,编码信息)方法对音频视频分别进行写入.../** * 合成视频1的音频视频2的图像 * * @param audioVideoPath 提供音频视频 * @param audioStartTime

    3K30
    领券