【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

这篇具有很好参考价值的文章主要介绍了【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【关键字】

音频编码、管道模式、createEncoder

【写在前面】

在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。

【主要功能代码】

import ohos.media.codec.Codec;
import ohos.media.common.BufferInfo;
import ohos.media.common.Format;
import ohos.media.common.Source;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

public class AudioEncoder {

    void creatEncoder(){

    }

    FileOutputStream fileOutputStream = null;

    public void encode(){
        System.out.println("encode start");
        try {
            File fd = new File("/data/data/com.example.myapplication/11.aac");
            fileOutputStream = new FileOutputStream(fd, true);
        } catch (FileNotFoundException e) {
            System.out.println("FileNotFoundException");
        } finally {
        }
        final Codec encoder = Codec.createEncoder();
        String path = "/data/data/com.example.myapplication/11.pcm";
        System.out.println("encoder = " + encoder);
        boolean ret = encoder.setSource(new Source(path), null);
        System.out.println("setSource ret = " + ret);
		
        Format fmt = new Format();
	// format格式中转码率和声道需与pcm相同
        fmt.putStringValue(Format.MIME, Format.AUDIO_AAC);
        fmt.putIntValue(Format.BIT_RATE, 128000);
        fmt.putIntValue(Format.CHANNEL, 2);
        fmt.putIntValue(Format.SAMPLE_RATE, 44100);
        fmt.putIntValue(Format.FRAME_RATE, 30); // 此设置必须,数值一般为30/60,或自行设置需要数值

        boolean b1 = encoder.setSourceFormat(fmt);
        System.out.println("setSourceFormat = " + b1);
        Codec.ICodecListener listener = new Codec.ICodecListener() {
            @Override
            public void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {
                System.out.println("byteBuffer = " + byteBuffer + "trackId = " + trackId + "bufferinfo = " + bufferInfo.bufferType);
                if(bufferInfo.bufferType == 4){
                    encoder.stop();
                    encoder.release();
                    try {
                        fileOutputStream.close();
                    } catch (IOException e) {
			// 打印异常
                        System.out.println("IOException");
                    }
                    return;
                }
                writeFile(byteBuffer,bufferInfo,trackId);

            }
            @Override
            public void onError(int errorCode, int act, int trackId) {
                System.out.println( "PlayerCallback onError errorCode: "+errorCode +", trackId:"+trackId);
            }
        };
        boolean b = encoder.registerCodecListener(listener);
        System.out.println("registerCodecListener = " + b);

        boolean start = encoder.start();
        System.out.println("start = " + start);
    }


    private void writeFile(ByteBuffer outputBuffer, BufferInfo info, int trackId) {
        try {
            final byte[] chunk = new byte[info.size+7];
            addADTSHeader(chunk,info.size+7);
            outputBuffer.get(chunk,7,info.size);
            fileOutputStream.write(chunk);
            outputBuffer.clear();
        } catch (FileNotFoundException e) {
            System.out.println("FileNotFoundException");
        } catch (IOException e) {
            System.out.println("IOException");
        } finally {
		
        }
    }
    /**
     * 添加AAC帧文件头
     *
     * @param packet    packet
     * @param packetLen packetLen
     */
    private void addADTSHeader(byte[] packet, int packetLen) {
        int profile = 2; // AAC
        int freqIdx = 4; // 44.1kHz
        int channelCount = 2;//声道
        packet[0] = (byte) 0xFF;
        packet[1] = (byte) 0xF9;
        packet[2] = (byte) (((profile - 1) << 6) + (freqIdx << 2) + (channelCount >> 2));
        packet[3] = (byte) (((channelCount & 3) << 6) + (packetLen >> 11));
        packet[4] = (byte) ((packetLen & 0x7FF) >> 3);
        packet[5] = (byte) (((packetLen & 7) << 5) + 0x1F);
        packet[6] = (byte) 0xFC;
    }
}

【说明和注意事项】

1、AAC文件有两种添加头文件方式:ADIF与ADTS,此处使用ADTS方式,ADTS是每一段编码都有一个头部,因此并不能只添加一次,需要在回调中添加头文件;添加头文件保存的aac文件可以直接播放;

2、format中需要设置FRAME_RATE,即fmt.putIntValue(Format.FRAME_RATE, 30);,数值必须大于0,否则可能会编码失败

3、编解码功能建议在子线程中执行,不要在主线程中。

【参考文档】

视频编解码文档:文档中心:视频编码文章来源地址https://www.toymoban.com/news/detail-673237.html

到了这里,关于【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 将音频PCM数据封装成wav文件

    之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去不必要的依赖。 首先需要构造wav头部,wav文件音频信息全部保存在头部,我们要做的就是在PCM数据的前面加入w

    2024年02月07日
    浏览(39)
  • 音频文件PCM、WAV、MP3的区别以及文件合并

    采样率即采样频率,指的一秒内的采样次数,它反映了采样点之间的间隔大小。常说的 44.1KHz 采样率,也即 1 秒采集了 44100 个样本。间隔越小,丢失的信息越少,数字声音就越逼真细腻,要求的存储量也就越大。由于计算机的工作速度和存储容量有限,而且人耳的听觉上限为

    2024年02月15日
    浏览(50)
  • pyqt5:python读取二进制文件(音频PCM文件)显示波形

    有个项目需要输出10-50Hz的低频信号驱动线圈,考虑使用音频功放硬件,所以做这方面的预研。 参考文章: 作者:很久没安静的回忆了,文章:音频 PCM 详解 作者:怪我冷i,文章:音视频从入门到精通——FFmpeg分离出PCM数据实战 3.作者:cuijiecheng2018,文章:windows下使用FFmp

    2023年04月21日
    浏览(59)
  • Qt-FFmpeg开发-音频解码为PCM文件(9)

    目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 1、概述 2、实现效果 3、主要代码 4、完整源代码 更多精彩内容 👉个人内容分类汇总 👈 👉音视频开发 👈 最近研究了一下FFmpeg开发,功能实在是太强大了,网上ffmpeg3、4的文章还是很多的,但是学

    2023年04月08日
    浏览(39)
  • 基于vue+websocket实现web端的实时pcm音频播放

    pcm-player是一个JavaScript库,用于在浏览器中播放PCM音频文件。PCM是一种数字音频编码格式,它将模拟音频信号转换为数字信号。在Vue中使用PCMPlayer可以让你在Web应用中轻松处理音频播放。 安装pcm-player 在Vue组件中引入PCMPlayer 在你的Vue组件中,你需要引入PCMPlayer库。你可以在组

    2024年04月09日
    浏览(122)
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

    用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22) Invalid argument,

    2024年04月11日
    浏览(58)
  • 【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

    【引言】 “JS卡片支持为组件设置action,包括router事件和message事件,其中router事件用于应用跳。若设置router事件,则action属性值为\\\"router\\\";abilityName为卡片提供方应用的跳转目标Ability名;params中的值按需填写,其值在使用时通过intent.getStringParam(\\\"params\\\")获取即可;”这一段是

    2024年02月12日
    浏览(42)
  • 【音视频 | wav】wav音频文件格式详解——包含RIFF规范、完整的各个块解析、PCM转wav代码

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍wav音频格式🍭 😎金句分享😎:🍭子曰:父母在,不远游,游必有方。 ——《论语·里仁篇》。意思是,父母还健在时,就不要

    2024年02月06日
    浏览(59)
  • 【音频】python读取写入wav文件

    使用librosa库: librosa.load(文件路径,采样率sampling rate) 直接用librosa的函数 librosa.output.write_wav(\\\'output.wav\\\', y, sr) 会报错: \\\"AttributeError: module \\\'librosa\\\' has no attribute \\\'output\\\'\\\" 。 这是因为librosa库在0.8.0版本后把这个函数删掉了,我们可以用soundfile库的soundfile.write()函数达到同样的目的

    2024年02月03日
    浏览(42)
  • 【HarmonyOS】服务卡片 API6 JSUI跳转不同页面并携带参数

     【】 服务卡片、卡片跳转不同页面、卡片跳转页面携带参数 【写在前面】           本篇文章主要介绍开发服务卡片时,如何实现卡片点击跳转不同页面,并携带动态参数到js页面。在此篇文章“服务卡片 API6 JSUI跳转不同页面”中说明了如果跳转不同页面,这里在

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包