[FFmpeg + OpenSLES 实现音频解码播放] 该文章首发于微信公众号:字节流动 FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02) :FFmpeg + ANativeWindow 实现视频解码播放 本文将利用 FFmpeg 对一个 Mp4 文件的音频流进行解码,然后使用 libswresample 将解码后的 PCM 音频数据转换为目标格式的数据 因此,本节将不再对音频解码流程进行赘述。 类似于视频流的处理,音频流的处理流程为:(Mp4文件)解协议->解封装->音频解码->重采样->播放。 [音频解码播放流程图.png] 这里面有反复提到重采样,类似于视频图像的转码,因为显示器最终显示的是 RGB 数据,这个一点比较好理解。那么为什么要对解码的音频数据进行重采样呢? 由于本文只介绍音频的解码播放,下面的代码仅展示 OpenSLES Audio Player 播放音频的过程。
FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 本文将利用 FFmpeg 对一个 Mp4 文件的音频流进行解码,然后使用 libswresample 将解码后的 PCM 音频数据转换为目标格式的数据,最后利用 OpenSLES 进行播放。 因此,本节将不再对音频解码流程进行赘述。 类似于视频流的处理,音频流的处理流程为:(Mp4文件)解协议->解封装->音频解码->重采样->播放。 ? 音频解码播放流程图 这里面有反复提到重采样,类似于视频图像的转码,因为显示器最终显示的是 RGB 数据,这个一点比较好理解,那么为什么要对解码的音频数据进行重采样呢? 由于本文只介绍音频的解码播放,下面的代码仅展示 OpenSLES Audio Player 播放音频的过程。
云点播为您提供媒资管理+短视频SDK+小程序插件+超级播放器等丰富的产品能力,快速构建长短视频一体化方案,9.9元体验一站式视频上传、转码、AI、及分发播放服务,还免费赠送基础版短视频License SDK 28天使用权
MP3能够以高音质、低采样率对数字音频文件进行压缩。应用最普遍。 FFmpeg 解码音频文件 上一篇FFmpeg 内容介绍 音视频解码和播放 介绍了FFmpeg进行解码的常见函数和,解码的过程。 直接核心贴代码 实现功能:将mp3、wav等格式转成pcm // 源文件路径 const char * src_path = env->GetStringUTFChars(src_audio_path 思路:由FFmpeg进行解码,将解码后的数据再通过jni传到Java中的audioTrack对象进行播放 创建AudioTrack对象 public class AudioPlayer { private openSl的音频播放 * * @param sampleRate 音频文件的频率 * @param channelCount 通道数 */ public void createAudio env->DeleteLocalRef(audio_sample_array); } } } 结语 以上就是利用FFmpeg对音频文件进行解码以及播放的内容
OpenSL ES是无授权费、跨平台、针对嵌入式系统 精心优化的硬件音频加速API。当然安卓也使用了它,AudioTrack、MediaPlayer的音频播放,底层都是利用OpenSL。 和AudioTrack相同,它只接受流,不支持音频数据的编解码,所以需要结合第三方库来使用。 为什么要使用OpenSL? native层流数据,这就会造成一定延迟,而对于音频播放APP而言,这是不可接受的。 前面我们使用了FFmpeg解码音频流,并使用了java层的AudioTrack进行播放,今天来实现在native层直接使用OpenSL播放。 channel_count; int out_size; void playerCallback(SLAndroidSimpleBufferQueueItf bq, void *pContext); /** * 音频解码
目录 音频解码流程 解码音频为pcm 使用AudioTrack播放音频 资料 收获 上一篇我们了解了FFmpeg解码流程、关键函数和结构体,实现了视频解码器。这篇我们来实现下音频的解码器。 解码流程和视频的基本一致。FFmpeg解码的音频裸数据是PCM格式,android上播放PCM音频数据可以通过AudioTrack和OpenSL ES来实现。 PCM音频 这一小节我们再上一小节解码输出PCM音频数据的基础上,再Native层调用Java层的AudioTrack进行完成音频的播放。 音频播放 音视频开发之旅(三)AudioTrack播放PCM音频 五、收获 了解音频解码流程 实现音频解码 解决由于没有重采样以及采样输出格式不对导致音频播放声音异常问题 使用AudioTrack的STRAM 模式对解码后的PCM进行播放 感谢你的阅读 下一篇我们学习实践另外一种音频的播放方式(OpenSL ES),欢迎关注公众号“音视频开发之旅”,一起学习成长。
目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上还有一种播放音频的方式即 具体参考官方提供的示例demo native-audio 是一个简单的音频录制器/播放器 三、OpenSL ES播放解码PCM的代码实现 了解了OpenSL ES的基本知识和使用流程,下面我们开始具体的代码实现 ES 音频渲染 FFmpeg 开发(03):FFmpeg + OpenSL ES 实现音频解码播放 android平台OpenSL ES播放PCM数据 Android通过OpenSL ES播放音频套路详解 六、收获 了解了OpenSl ES的基本知识和播放音频数据的流程 代码实现OpenSL ES播放音频流 和FFmpeg结合,实现opensl播放解码后的音频数据 解决遇到的问题 感谢你的阅读 学习实践了视频的解码 、音频的解码和播放,下一篇我们通过OpenGL ES来实现解码后视频的渲染,欢迎关注公众号“音视频开发之旅”,一起学习成长。
通常想要播放音频第一思路是写一个 audio 标签,实际上单纯 JS 不插入标签也是可以实现的。这种方式只能是 audio video 则没有提供此类 api。 具体实现: const instance = new Audio() instance.crossOrigin = '*' instance.oncanplaythrough = () => { instance.play () } instance.onended = () => { // 播放结束触发,自定义播放按钮重置 } instance.src = audioUrl instance.load() 创建的 audio 自带一个 preload="audo" 的属性,指示浏览器预加载音频资源
dst_buffer_size); 思路 整体思路: 由FFmpeg打开音频文件,获取相应的解码器。 拿到相应的音频编码格式,采样率,声道等。 编写解码函数getPCM,为了让opensles调用获取到解码的数据。 创建opensles的对象和接口,创建音频播发器,创建缓冲队列和缓冲回调函数,设置播放状态为播放中。 主动触发回调函数,在回调函数调用解码函数getPCM,将音频文件转码成pcm文件,然后将每一帧解码的数据和大小,传到openSles的数据缓冲队列中,进行音频播放。 这样播放的音频文件就不会有问题。 结语 以上就是个人利用FFmpeg+OPensles 播放音频文件。如果有错误欢迎指正。
最近接触到的一个项目, 有音频播放、切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程。 MediaPlayer 播放音频最先想到的就是MediaPlayer这个Android提供的原生API了,在Android 6.0+(23+)MediaPlayer可以通过setSpeed来改变播放速率 ,我发现手上的测试机Honor V9执行该操作后 ,播放静默了 ,不仅没有实现播放速率的切换,播放也不能恢复。 实际实现过程中 ,seekTo正常,播放速率切换也正常(只是在切换到慢速0.5x的时候存在重音的情况),但是播放不了https开头url的音频文件,搜索了一下需要自己编译ijkplayer源码以支持https ExoPlayer 最终选择的是google的exoPlayer来实现,api类似MediaPlayer,但也有些差异,下面贴出关键播放控制部分的代码。
上次已经得到PCM编码的音频流,今天来实现播放PCM音频流,使用安卓提供的AudioTrack,方法很简单,在native层调用java代码 首先在java中定义相应的方法: package com.aruba.ffmpegapplication nb_streams; ++i) { if (formatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {//如果是音频流 id获取视频流解码器 AVCodec *codec = avcodec_find_decoder(codecContext->codec_id); //打开解码器 if (avcodec_open2 codecContext->sample_rate, 0, NULL ); swr_init(swrContext); //原音频通道数 avformat_free_context(formatContext); env->ReleaseStringUTFChars(inputFilePath_, inputFilePath); } 经过测试,已经可以播放了
视频播放器基本原理 下图引用自“雷霄骅,视音频编解码技术零基础学习方法”,因原图太小,看不太清楚,故重新制作了一张图片。 ? 音视频同步 根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。 2. 简易播放器的实现-音频播放 2.1 实验平台 实验平台:openSUSE Leap 42.3 FFmpeg版本:4.1 SDL版本:2.0.9 FFmpeg开发环境搭建可参考“ffmpeg开发环境构建 格式,但SDL2.0并不支持planar格式, // 若将解码后的frame直接送入SDL音频缓冲区,声音将无法正常播放。 // 在暂停期间,会将静音值往音频设备写。 SDL_PauseAudio(0); 2.4.3 音频回调函数 用户实现的函数,由SDL音频处理子线程回调 // 音频处理回调函数。
,占用的系统资源是很多的,加载资源也需要时间,所以它不适合用来频繁播放小音频文件,比如控件焦点、点击时需要播放小音频文件,这个时候用SoundPool来播放音频文件,比用MediaPlayer来播放效率要高很多 这里也来说说,如果用MediaPlayer来播放小音频文件的话,会出现延时,点击了之后等会儿才出现声音。所以,SoundPool比MediaPlayer更轻量级,适合用于频繁播放的小音频文件。 第二步:编写音频播放的类 public class MusicPlayer { private Context mContext ; private static MusicPlayer sInstance if(sSpMap.get(type) == null) return ; mSp.play(sSpMap.get(type), 1, 1, 0, 0, 1) ; } } 第三步:调用接口,播放音频 在两个回调接口中实现。 以上就是本文的全部内容,希望对大家的学习有所帮助。
最近做一个播放音频的小功能,使用毛坯界面简单记录下(点击上边的ImageButton播放,下边的ImageView请无视) ? activity_picture.xml页面: <? { private ImageButton ibCogVideo; private ImageView ivCogPicture; SoundPool mSoundPool; //一般用来播放短音频 ,参数为(可容纳音频个数,声音类型,音频品质默认为0) map.put(1,mSoundPool.load(this,R.raw.abc,100)); //设置第一个音频 } /*绑定点击事件 /*点击事件*/ @Override public void onClick(View v) { mSoundPool.play(map.get(1),1,1,100,0,1); //参数为(要播放的音频 ,左声道音量,右声道音量,音频优先级,循环次数,速率) } } 另外,音频文件我放到了项目中,及res中的raw文件。
音频解码就是将mp3 aac等格式这些文件解析为pcm格式的过程。 解码 将解码数据封装在AVFrame <-- 拿到编码的数据AVPacket <-- 读取数据源 <-- 解码文件参数设置 //3.1 AVPacket初始化 AVPacket * uint64_t out_channel_layout = AV_CH_LAYOUT_STEREO; //nb_samples: AAC-1024 MP3-1152 //音频帧中每个声道的采样数 int out_nb_samples = pCodecContext->frame_size; //音频采样格式 量化精度 AVSampleFormat out_sample_fmt return -1; } if (got_picture > 0) { //4.3 转换音频数据
如何在小程序中实现音频播放 在如何使用小程序媒体组件这篇文章中,我们介绍了小程序媒体组件的使用,但是对音频组件部分讲的不够详细,本文将对音频部分做些补充。 ,比如可以通过后端实现下一曲的功能。 音频API - AudioContext的使用 我们已经学会了音频组件的基本调用步骤,控制音频暂停,播放,转跳等功能需要相关API的支持,接下来,我们就看看如何使用API来实现这些功能。 我们可以使用下面的代码来实现基本的播放功能。 暂停后的音频再播放会从暂停处开始播放 InnerAudioContext.stop() 停止。停止后的音频再播放会从头开始播放。
用户反馈,在使用EasyPlayer.js时传入到播放器的音频,无法解析到真正的音频采样,使用vlc、ffplay等都是无法识别到正确的音频采样率,导致播放音频声音异常。对此我们进行了排查测试。 基于用户提供的音频采样率,将播放器默认为固定的采样率,解析播放音频即可正常。以下是具体方法: 1)在播放器入口参数加入sampleRate参数,默认为0,则走正常的解析流程。 如果不为0,则使用用户传入的采样率; 2)传入到H.265解码播放器中; 3)在H.265解码播放器中,使用传入的采样率; 4)用户在代码中设置采样率。 通过以上动态设置,EasyPlayer.js可实现灵活解码h.265音频。 EasyPlayer多个衍生版本无论是在对接设备型号种类,还是在对接编码的兼容性上,都具备较高的可用性。 在应用场景上,能实现手机直播、电脑直播等,感兴趣的用户可以前往官网下载、部署和测试。
iOS下的音频播放实现有了一定的研究。 本篇为《iOS音频播放》系列的第一篇,主要将对iOS下实现音频播放的方法进行概述。 基础 先来简单了解一下一些基础的音频知识。 MP3中的每一个帧都有自己的帧头,其中存储了采样率等解码必须的信息,所以每一个帧都可以独立于文件存在和播放,这个特性加上高压缩比使得MP3文件成为了音频流播放的主流格式。 ] iOS音频播放概述 了解了基础概念之后我们就可以列出一个经典的音频播放流程(以MP3为例): 读取MP3文件 解析采样率、码率、时长等信息,分离MP3中的音频帧 对分离出来的音频帧解码得到PCM数据 apple提供的接口类型非常丰富,可以满足各种类别类需求: 如果你只是想实现音频的播放,没有其他需求AVFoundation会很好的满足你的需求。
问题描述:通过picker设置时间,到了设定好的时间 闹钟响起,并弹出提示框,点击确定,停止播放音频。 player prepareToPlay]; //准备工作 //[_player stop]; //卡一下 [_player play]; //开始播放
[FFmpeg + ANativeWindow 实现视频解码播放] 该原创文章首发于微信公众号:字节流动 本文将利用 FFmpeg 对一个 Mp4 文件的视频流进行解码,然后使用 libswscale [视频解码播放] FFmpeg 视频解码 [雷霄骅博士的音视频处理流程图] 参考雷霄骅博士的音视频处理流程图,我们大概了解了本节的处理流程:(Mp4文件)解协议->解封装->视频解码->缩放或格式转换- ,包含编解码器类型、视频宽高、音频通道数和采样率等信息; AVCodec:存储编解码器信息的结构体; AVStream:存储音频或视频流信息的结构体; AVPacket:存储音频或视频编码数据; AVFrame :存储音频或视频解码数据(原始数据); [FFmpeg 视频解码播放流程] 视频解码流程: //1.创建封装格式上下文 m_AVFormatContext = avformat_alloc_context ANativeWindow if(m_NativeWindow) ANativeWindow_release(m_NativeWindow); 以上就是 FFmpeg + ANativeWindow 实现视频解码播放的整个过程
标准直播LVB依托腾讯多年的音视频技术平台,以及全球海量加速节点和领先的音视频 AI 技术,为开发者提供专业、稳定的直播推流、转码、分发及播放服务,全面满足低延迟、超高画质、大并发访问量的要求,适用于教育、游戏、媒体、电商、社区等场景。
扫码关注云+社区
领取腾讯云代金券