镭拓网站建设官网,常用的网页设计软件,企业电子网站的建设案例分析,html网站地图模板1.主题音频是流式数据#xff0c;并不像视频一样有P帧和B帧的概念。就像砌墙一样#xff0c;咔咔往上摞就行了。一般来说#xff0c;AAC编码中生成文件这一步#xff0c;如果使用的是OutputStream流写入文件的话#xff0c;就完全不需要计算时间。但在音视频同步或者使用A…1.主题音频是流式数据并不像视频一样有P帧和B帧的概念。就像砌墙一样咔咔往上摞就行了。一般来说AAC编码中生成文件这一步如果使用的是OutputStream流写入文件的话就完全不需要计算时间。但在音视频同步或者使用Android自带的MediaMuxer来生成音频文件时就需要计算音频帧的时间戳。2.参考本文所涉及到的计算方法和API为在Android环境下。使用AudioRecord音频录制MediaCodeC编码AAC格式音频同时使用MediaMuxer封装AAC格式音频文件。3.方法AAC编码有两种计算时间戳的方式。第一种使用PCM的数据量来计算第二种计算出AAC编码相应参数配置下一帧的持续时间再配合帧数来计算。4.AAC编码、MediaMuxer生成文件伪代码MediaCodeC的AAC编码流程不再赘述这里用伪代码来代替。主要是为了体现在代码何处设置时间戳// MediaCodeC获得可用输入队列index codeC.dequeueInputBuffer(......)// 当获取到可用输出队列时我们将获取的PCM数据填入inputBuffer codec.getInputBuffer(index)// 将PCM数据ByteArray填充到InputBufferinputBuffer.put(byteAarray——PCM数据)codec.queueInputBuffer(index, 0, byteArray的size , presentationTimeUs, 0)在以上的伪代码中presentationTimeUs就是需要我们设置时间戳的地方填充PCM数据后在得到MediaCodeC输出后使用MedaMuxer写入数据生成AAC文件。path 输出路径。后缀aac、或者mp4mediaMuxer MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)mediaMuxer.addTrack(音频轨)mediaMuxer.start()// codec拿到可用的输出数据。这些数据就是AAC格式的音频数据id codec.dequeueOutputBuffer(bufferInfo, 10000)if(id 0){ outputBuffer codec.getOutputBuffer(id) mediaMuxer.writeSamplet(audioTrack, outputBuffer, bufferInfo) }需要注意的是使用MediaMuxer生成AAC音频文件时不需要添加AAC头信息直接写入即可。MediaMuxer写入文件时BufferInfo这个参数就包含了这一帧数据的偏移、以及时间戳等信息。5.使用PCM的数据量来计算PCM是没有经过压缩的纯音频数据我之前写过一篇音频入门的文章初识音频记录了一些PCM相关的常识问题感兴趣的可以去看看。PCM作为最原始的音频数据可以根据大小来计算出时间先给出公式presentationTimeUs 1000000L * (totalBytes / 2) / sampleRate这是配置为采样率sampletRate、采样位数为16bit、单声道的PCM文件时间戳计算方式接下来我们来分析以上公式的计算由来假设有一段PCM文件采样率为S,采样位数为n--(一般 采样位数的选择有4bit、8bit、16bit、32bit)声道为单声道。那么在1s内这段PCM的大小为size S * n * 1,单位为bit众所周知1 Byte 8bit, 1 Short 16bit。那么单位时间内PCM的大小为:以byte为单位 S * n * 1 / 8以short为单位 S * n * 1 / 16那么根据以上就可得到配置参数为采样率sampleRate、16bit、声道为1的PCM文件当传入编码器的总大小达到totalByte时时间戳的计算方式currents (微妙) totalByte / (sampleRate * 16 * 1 / 8) totalByte / 2 / sampleRate * 1000000L 当然如果选择以ShortArray来承载PCM数据的话那么公式则变为:currents (微妙) totalShort / (sampleRate * 16 * 1 / 16) totalShort / sampletRate * 1000000L6.使用AAC帧时间计算当编码器每输出一次数据即可视作输出一帧AAC数据。一帧AAC原始数据包括1024个sample那么AAC音频文件1s内的帧数为sampleRate / 1024 帧。从而得到一帧AAC的持续时间为:perFrameTime (微妙) 1000000L / sampleRate / 1024原文地址解决AAC音频编码时间戳的计算问题 - 资料 - 音视频开发中文网 - 构建全国最权威的音视频技术交流分享论坛★文末名片可以免费领取音视频开发学习资料内容包括FFmpeg webRTC rtmp hls rtsp ffplay srs以及音视频学习路线图等等。见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓