【问题标题】:Audio playing back at the wrong speed using FFmpeg on Android在 Android 上使用 FFmpeg 以错误的速度播放音频
【发布时间】:2011-03-31 14:20:53
【问题描述】:

以下一般问题: 我将音频解码如下:

ReSampleContext* rsc = av_audio_resample_init(
        1, aCodecCtx->channels,
        aCodecCtx->sample_rate, aCodecCtx->sample_rate,
        av_get_sample_fmt("u8"), aCodecCtx->sample_fmt,
        16, 10, 0, 1);

while (av_read_frame(pFormatCtx, &packet)>= 0) {
    if (aCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
        int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2;
        int size=packet.size;
        int decoded = 0;

         while(size > 0) {
             int len = avcodec_decode_audio3(aCodecCtx, pAudioBuffer, 
                 &data_size, &packet);

             //Сonvert audio to sample 8bit
             out_size = audio_resample(rsc, outBuffer, pAudioBuffer, len);

             jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);

             memcpy(bytes, outBuffer, out_size);
             (*env)->ReleaseByteArrayElements(env, array, bytes, 0);
             (*env)->CallStaticVoidMethod(env, cls, mid, array, out_size, number);

             size -= len;
             number++;
         }
     }
 }

接下来发布 AudioTrack。在那之后,我听到了那首必要的歌曲,但噪音和速度大了 2 倍。可能是什么问题?

更新: 这是Java代码:

public static AudioTrack track;
public static byte[] bytes;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    int bufSize = 2048;
    track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, 
                AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STREAM); 

    bytes = new byte[bufSize];
    Thread mAudioThread = new Thread(new Runnable() {
        public void run() {
            int res = main(2, "/sdcard/muzika_iz_reklami_bmw_5_series_-_bmw_5_series.mp3", bytes);
            System.out.println(res);
        } 
    });
    mAudioThread.setPriority(Thread.MAX_PRIORITY);
    mAudioThread.start(); 
}

private static void play(byte[] play, int length, int p) {
    if (p==0){
        track.play();
    }
    track.write(play, 0, length); 
}

【问题讨论】:

  • 接受您之前问题的答案;你问了 8 个问题,但只接受了 1 个;它在您的个人资料中

标签: android ffmpeg decode audio-player


【解决方案1】:

这可能是采样率不匹配的问题。与实际采样率相比,您可能正在创建采样率较低的音频轨道。

Matthew 所述,这也可能是 AudioTrack 通道配置的问题。

也许你应该试试我在这个 question 中回答的问题。

因为您通过 Java 与 JNI 交互的方式,我不确定这是否可行。我对JNI知之甚少。但我的代码适用于我,这也是我目前在我的应用中使用的代码。

【讨论】:

  • 我要求在 C 采样率 44100 和 Audiotrack 中放一样。也许还有其他问题?
  • 文件中音频的采样率是否和44100一样? FFmpeg 将为您提供要播放的文件的采样率。使用相同。换句话说,有一个名为 mediainfo 的工具,它将为您提供文件的编解码器和其他详细信息。看看是否正确。
  • aCodecCtx-> sample_rate 返回我 44,100!怎么会是错误的采样率?
  • 这可能是缓冲区传输的问题?今天我将发布代码AudioTrack。看看
  • 答案已更新。也许您应该尝试一种不同的 JNI 交互方法。我不确定您的代码出了什么问题。
【解决方案2】:

也许您的AudioTrack 期待立体声数据,但您发送的是单声道数据。您可以尝试将AudioTrack 频道配置设置为CHANNEL_OUT_MONO

【讨论】:

  • 我用的是CHANELL_OUT_MONO,但是没用
猜你喜欢
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多