1

以下のオープンソースプロジェクトで作成されたビデオにオーディオを追加しようとしています

特にhttps://github.com/madisp/trails/blob/master/app/src/main/java/com/madisp/trails/CaptureService.java

MIC からオーディオを取得し、オーディオ トラックとしてエンコード ファイルに書き込む必要があります。現時点では、Muxer でエンコードされたファイルにはビデオ トラックしかありません。

以下の問題なくMICからオーディオを取得できます

int nChannels = 1;
int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 2;
AudioRecord aRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize);

short[] buffer = new short[44100 * nChannels];
aRecorder.startRecording();
int readSize = 0;

while (recording) {
    readSize = aRecorder.read(buffer, 0, minBufferSize);
    if (readSize < 0) {
        break;
    } else if (readSize > 0) {
        // do stuff with buffer
    }
}
aRecorder.stop();
aRecorder.release();

しかし、それを( https://github.com/madisp/trails/blob/master/app/src/main/java/com/madisp/trails/CaptureService.java)に組み込む方法がわかりません

while (running) {
    int index = avc.dequeueOutputBuffer(info, 10000);
    if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
        if (track != -1) {
            throw new RuntimeException("format changed twice");
        }
        track = muxer.addTrack(avc.getOutputFormat());
        muxer.start();
    } else if (index >= 0) {
        if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
            // ignore codec config
            info.size = 0;
        }
        if (track != -1) {
            ByteBuffer out = avc.getOutputBuffer(index);
            out.position(info.offset);
            out.limit(info.offset + info.size);
            muxer.writeSampleData(track, out, info);
            avc.releaseOutputBuffer(index, false);
        }
    }
}

はい、私は文字通りあなたにコードを書くように頼んでいることを理解していますが、私はこれについて十分な専門知識を持っていません

どんな助けでも大歓迎

ありがとう

4

1 に答える 1

2

まず、 - で使用されるバッファのbyte[]代わりに使用します。これにより、少し簡単になります。short[]AudioRecord

次に、受信したバッファをエンコードするために、次のようなものが機能するはずです(テストされていません):

while (recording) {
    readSize = aRecorder.read(buffer, 0, minBufferSize);
    if (readSize < 0) {
        break;
    } else if (readSize > 0) {
        boolean done = false;
        while (!done) {
            int index = avc.dequeueInputBuffer(10000);
            if (index >= 0) { // In case we didn't get any input buffer, it may be blocked by all output buffers being full, thus try to drain them below if we didn't get any
                ByteBuffer in = avc.getIndexBuffer(index);
                in.clear();
                in.put(buffer, 0, readSize);
                avc.queueInputBuffer(index, 0, readSize, System.nanoTime()/1000, 0);
                done = true; // Done passing the input to the codec, but still check for available output below
            }
            index = avc.dequeueOutputBuffer(info, 10000);
            if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                if (track != -1) {
                    throw new RuntimeException("format changed twice");
                }
                track = muxer.addTrack(avc.getOutputFormat());
                muxer.start();
            } else if (index >= 0) {
                if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
                    // ignore codec config
                    info.size = 0;
                }
                if (track != -1 && info.size > 0) {
                    ByteBuffer out = avc.getOutputBuffer(index);
                    out.position(info.offset);
                    out.limit(info.offset + info.size);
                    muxer.writeSampleData(track, out, info);
                    avc.releaseOutputBuffer(index, false);
                }
            }
        }
    }
}

通常の SW AAC エンコーダーは任意のバイト数のオーディオを渡せば問題ないと思いますが、エンコーダーがうるさい場合は、記録されたデータを 1024 サンプルのブロック (モノの場合は 2048 バイト) で渡す必要があります。 、ステレオの場合は 4096 バイト)。

于 2014-12-26T22:35:11.340 に答える