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

Android中如何提取和生成mp4文件

随着Android 4.4及以上版本逐渐普及,Android 4.1引入MediaExtractor类,以及Android 4.3引入MediaMuxer类,终于可以开始正式地“发光发热”了。...本文将介绍如何利用Android SDK提供MediaExtractor和MediaMuxer类来完成mp4文件提取和生成,指出开发过程中会遇到坑,并给出简单Demo示例代码。...int videoTrackIndex = -1; int audioTrackIndex = -1; for(int i = 0; i < mMediaExtractor.getTrackCount...这里产生第二个坑,就是writeSampleData函数最后一个参数是一个BufferInfo对象,你必须认真地填入“正确”值: BufferInfo info = new BufferInfo(...i = 0; i < mMediaExtractor.getTrackCount(); i++) { MediaFormat format = mMediaExtractor.getTrackFormat

2K70

AndroidMediaExtractor和MediaMuxer合成音视频

工具准备: 视频分离合成我主要用到了MediaExtractor和MediaMuxer两个类: MediaExtractor是用于提取多路、通常编码视频资源,通过它我们可以选择音频或者视频轨,...然后分别对它们进行操作等; MediaMuxer是用于复用基本流,用它可以将音频和视频合成,目前支持输出MP4,Webm和3GP格式视频,在Android7.0以后支持多路复用帧MP4。...开始搞: 1.提取音视频: 我们将视频一路径通过setDataSource方法设置给MediaExtractor对象,然后通过方法getTrackCount获取到该视频轨道数,接着循环轨道数,此时我们可以通过...muxer.start(); //开始合成 audioVideoExtractor.selectTrack(mainAudioExtractorTrackIndex); //将提供音频视频选择到音轨...,类似快进 } frameVideoExtractor.selectTrack(frameExtractorTrackIndex); //将提供视频图像视频选择到视频轨

2.9K30
您找到你想要的搜索结果了吗?
是的
没有找到

使用 MediaExtractor 及 MediaCodec 解码音视频

01 前言 大家好,本文是 iOS/Android 音视频专题 第四篇,从本篇文章开始我们将动手编写代码。代码工程将在 Github 进行托管。...02 MediaExtractor 基本使用 对音视频媒体文件解码时,我们首先需要分离出媒体文件音视频轨道,MediaExtractor 就是干这个,它可以告诉你媒体中轨道(Track)数量,并根据索引读取指定轨道数据...// 媒体文件中轨道数量 (一般有视频,音频,字幕等) int trackCount = extractor.getTrackCount(); // mime type 指示需要分离轨道类型 String...当请求到空闲队列后返回 ByteBuffer,将 ByteBuffer 填充数据后可调用 queueInputBuffer 加入编解码队列。...将不可用 extractor.release(); // 释放解码器 mediaCodec.release(); 完整代码详见:DemoMediaCodecActivity 05 结束语 目前,我们解码后视频尚未渲染在屏幕

2.1K20

TRTC硬编解码绿屏黑屏之编码器分辨率支持

背景 在一些低端机型,或者定制设备,会出现硬编硬解黑屏/绿屏,有一种情况就是因为设备自身编解码器分辨率不支持设置分辨率导致,此时需要去获取下设备支持分辨率来验证是否是该问题导致 如何获取当前手机支持解码最大分辨率...这是一个xml文件,可以直接看到MediaCodecs–>Decoders节点下各个视频格式支持情况,以**华为荣耀7x Android 8.0 **为例 image.png 获取解码视频宽和高...MediaExtractor mediaExtractor = new MediaExtractor(); mediaExtractor.setDataSource(path);...int trackCount = mediaExtractor.getTrackCount(); for (int i = 0; i < trackCount; i++) {..."video/" :"audio/")) { return mediaExtractor.getTrackFormat(i); } } }

91420

Android FFmpeg + MediaCodec 实现视频硬解码

前面 FFmpeg 系列文章中,已经实现了音视频播放、录制、添加滤镜等功能: Android FFmpeg 流媒体边播放边录制功能 FFmpeg 实现带滤镜微信小视频录制功能 FFmpeg + OpenGL...MediaCodec 介绍 MediaCodec 是 Android 提供用于对音视频进行编解码类,它通过访问底层 codec 来实现编解码功能,是 Android media 基础框架一部分... native 接口,Google 从 Android 5.0 开始提供,Native 代码编译时需要引入 mediandk 库,官方 demo : https://github.com/android...个字节替换为 0x00000001 得到标准 NALU 数据,这样保证 MediaCodec 解码正确。...(m_MediaExtractor); LOGCATE("HWCodecPlayer::InitDecoder AMediaExtractor_getTrackCount %d tracks

3.1K20

Android原生编解码接口 MediaCodec 之——踩坑

= 0; 部分机型MediaCodec.configure直接crash 未设置编码强制要求一些配置 抛出 IllegalStateException 看这个例子stackoverflow...(path); int trackCount = mediaExtractor.getTrackCount(); for (int i = 0; i < trackCount; i++) { MediaFormat...可以通过xml查看,位置:vendor/etc/media_codecs.xml 另外,在默认情况下,如果上层没有主动设置bitrate_mode的话,返回是VBR。...也就是默认采用VBR 关于VBR CQ CBR区别,可查看Android原生编解码接口 MediaCodec 之——完全解析中流控。...设置了无效,还是默认值,经排查 是因为在android7.0以下,android 内部写死了参数,编码出来只能是Baseline,除非系统改过这个BUG,否者设置无效,甚至导致configure参数失败

4.4K20

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

分离轨道信息 getTrackCount()获取轨道数量 MediaFormat format = mediaExtractor.getTrackFormat(i);获取对应轨道信息。...返回-1时代表没有更多数据了 advance 跳到下一个数据包,如果没有下一个就返回false 释放资源 使用完后调用release进行资源释放 ADTS ADTS是AAC音频文件常见传输格式。...当你编码AAC裸流时候,遇到写出来AAC文件并不能在PC和手机上播放,很大可能就是AAC文件每一帧里缺少了ADTS头信息文件包装拼接。只需要加入头文件ADTS即可。...for (int i = 0; i < mediaExtractor.getTrackCount(); i++) {//遍历媒体轨道 此处我们传入是音频文件,所以也就只有一条轨道...i < encodeInputBuffers.length - 1; i++) { chunkPCM = getPCMData();//获取解码器所在线程输出数据 代码后边贴上

1.9K50

使用 AudioTrack 播放音频轨道

01 前言 大家好,本文是 iOS/Android 音视频开发专题 第七篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址...在上篇文章 OpenGL ES 实现播放视频帧 中我们已经知道如何使用 GLSurfaceView 将解码后视频渲染到屏幕,但是,我们播放器还不具备音频播放功能,在本篇文章中我们将使用 AudioTrack...常用采样频率有 22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz。目前在 Android 设备中,只有 44.1kHz 是所有设备都支持采样频率。 ?...// 媒体文件中轨道数量 (一般有视频,音频,字幕等) int trackCount = extractor.getTrackCount(); //...= null; // 记录轨道索引id,MediaExtractor 读取数据之前需要指定分离轨道索引 int trackID = -1; for (

2K31

StageFright框架流程解读

3、 StageFrightDecode 经过“数据流封装”得到两个MediaSource,事实是两个OMXCodec。...Stagefright AV同步部分,audio全然是callback驱动数据流,video部分在onVideoEvent里获取audio时间戳,是传统AV时间戳做同步。...调度器)  打开mUri所指定文件头部,则会依据类型选择不同分离器(如MPEG4Extractor)  使用 MPEG4Extractor对MP4进行音视频轨道分离,并返回MPEG4Source...类型视频轨道给mVideoTrack  依据 mVideoTrack中编码类型来选择解码器,avc编码类型会选择AVCDecoder,并返回给mVideoSource,并设置mVideoSource...MediaExtractor::Create(dataSource)依据不同数据内容创建不同数据读取对象。

83220

Android平台实现mp4文件实时推送RTMP|轻量级RTSP服务|GB28181平台

本次以MediaExtractor为例,先利用MediaExtractor,把mp4文件音视频数据分离,然后调用我们publisher模块,实现编码后数据对接到RTMP服务器、轻量级RTSP服务或GB28181...mFile.exists()){Log.e(TAG, "mp4文件不存在");return;}MediaExtractor mediaExtractor = new MediaExtractor();try...}int count = mediaExtractor.getTrackCount();//获取轨道数量Log.e(TAG, "轨道数量 = "+count);for (int i = 0; i < count...return;}if (gb28181_agent_.isRunning()) {gb28181_agent_.terminateAllPlays(true);// 目前测试下来,发送BYE之后,有些服务器立即发送...;}以上就是大概流程,需要注意是,本地MP4文件作为实时数据发送时候,需要注意时间戳问题,简单来说,确保“1分钟数据,按照时间戳间隔,1分钟均匀发出去”。​

31900

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

一期刚刚掀完桌子没多久《Android MP3录制,波形显示,音频权限兼容与播放》,就有小伙伴问我...改变颜色和播放输出波形 Android音频播放与录制 MediaPlayer、MediaRecord、AudioRecord,这三个都是大家耳目能详Android多媒体类(= =没听过也要假装听过...),包含了音视频播放,音视频录制等...但是还有一个被遗弃熊孩子AudioTrack,这个因为太不好用了而被人过门而不入(反正肯定不是因为懒),这Android多媒体四大家族就齐了,MediaPlayer...因为一期波形播放数据是short形状,所以我们为了兼容就把数据转为short,这里要注意合成short可能有大小位问题,然后计算音量用于提取特征值。...最后收两句: 有时候会听到有人说做业务代码只是在搬砖,对自己技术没有什么提升,这种理论我个人并不是十分认同,因为相对于自己开源和学习新技术,业务代码可以让你更加严谨对待你代码,遇到更多你无法回避问题

3.3K20

Android 实现 视频 转 字符画效果

我们看一下实现出来效果图: ? 效果图有点糊,原文效果图更好 实现效果还是让人挺满意。...我们下面说一下具体实现步骤, 视频取帧 对帧图片进行字符画转换 对获取到字符画合成视频 我们分开一步一步讲: 视频取帧 视频取帧整个功能最麻烦一步,目前Android视频取帧方法有好几种。...但主要问题点是 MediaCodec 解码返回帧图片数据是YUV格式,它跟我们平时使用 RGB 格式很不一样是它三个值表示是亮度,色度,饱和度。...presentationTimeUs = -1; int outputBufferId; Image image = null; //视频定位到指定时间一帧...extractor.seekTo(sec, MediaExtractor.SEEK_TO_PREVIOUS_SYNC); //因为extractor定位帧不是准确

79720

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

封装Android原生提取器 之前提过,Android原生自带有一个MediaExtractor,用于音视频数据分离和提取,接来下就基于这个,做一个支持音视频提取工具类MMExtractor: class..."video/"或者"audio/"开头编码格式; 3)最后通过获取索引,返回对应音视频多媒体格式信息。...readSampleData(byteBuffer, 0) 此时,将返回读取到音视频数据流大小,小于0表示数据已经读完。...:距离跳播位置最近关键帧 到这里你就可以明白,为什么我们平时在看视频时,拖动进度条释放以后,视频通常会在你释放位置往前一点 封装音频和视频提取器 上面封装工具中,可以支持音频和视频数据提取...,基本上声音都会出现异常,而画面的播放也像倍速播放一样。

2.3K20
领券