【问题标题】:Record and playback with Opus Codec in Android在 Android 中使用 Opus 编解码器进行录制和播放
【发布时间】:2015-01-18 11:07:30
【问题描述】:

我正在开发一个需要使用 Opus 编解码器进行录制和播放的项目,我搜索了很多,但找不到使用该解决方案的任何演示/示例。我找到了一个带有编码器的演示,但找不到解码器。我只用C找到这个编解码器的源代码,你能帮帮我吗?

【问题讨论】:

标签: android encoder decoder recorder opus


【解决方案1】:

试试这个GitHub demo。我编译了它,但它不播放录制的声音。

【讨论】:

  • 嗨,我试过了,但没用。该 git 中的发行说明提到“什么不起作用:使用 opus 编解码器录制和播放”
【解决方案2】:

你好,demo 是一个很好的起点,他真的很接近解决它。然而,每个包必须单独从编码器发送到解码器。而不是将所有内容保存到文件中,然后在不考虑包启动的情况下将它们读回。
我修改了代码以写入编码字节数,当我解码时,我首先读取每个数据包中的字节数,然后读取有效负载。

这是 OpusEncoder.java 中修改后的代码

public void write( short[] buffer ) throws IOException
    {
        byte[] encodedBuffer = new byte[buffer.length];
        int lenEncodedBytes = this.nativeEncodeBytes( buffer , encodedBuffer);
        Log.i(TAG,"encoded "+lenEncodedBytes+" bytes");
        if (lenEncodedBytes > 0)
        {
            this.out.write(lenEncodedBytes);
            this.out.write( encodedBuffer, 0, lenEncodedBytes );
        }
        else
        {
            Log.e( TAG, "Error during Encoding. Error Code: " +  lenEncodedBytes);

            throw new IOException( "Error during Encoding. Error Code: " +  lenEncodedBytes );
        }
    }


这是 OpusDecoder.java 中修改后的代码

        byte[] encodedBuffer;
        int bytesEncoded=this.in.read();
        int bytesDecoded=0;

        Log.d( TAG, bytesEncoded + " bytes read from input stream" );
        if ( bytesEncoded >= 0 )
        {
            encodedBuffer=new byte[bytesEncoded];
            int bytesRead = this.in.read( encodedBuffer );
            bytesDecoded = nativeDecodeBytes( encodedBuffer , buffer);
            Log.d( TAG, bytesEncoded + " bytes decoded" );
        }

【讨论】:

  • “包”是指“包”吗?我试过你的补丁,但仍然没有让记录和播放工作。很多只是弹出和点击
  • 仍在玩这个,它似乎可以录制,但播放不起作用。 opus 报告一次只解码 3 个字节。
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 2021-10-25
  • 2019-01-09
  • 2012-09-10
  • 2012-12-28
  • 2020-09-24
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多