2015-11-12 6 views
0

я использую FFmpeg расшифровать мой flac файл и записать его в pcm файл, а затем использовать GoldenWave играть с pcm signed 16bit, little endian, mono и общее время воспроизведения в порядке.декодирования FLAC файл с avcodec_decode_audio4 не работает хорошо

Сомневаюсь, что я напишу 2-канальный файл в одном месте, но я не знаю, как получить каждый канал сигнала и записать его в файл pcm.

любая помощь? Спасибо.

while (av_read_frame(fmt_ctx, &pkt) >= 0) { 
      AVPacket orig_pkt = pkt; 
      do { 
       ret = decode_packet(&got_frame, 0); 
       if (ret < 0) 
        break; 
       pkt.data += ret; 
       pkt.size -= ret; 
      } while (pkt.size > 0); 
      av_free_packet(&orig_pkt); 
     } 

     pkt.data = NULL; 
     pkt.size = 0; 
     do { 
      decode_packet(&got_frame, 1); 
      LOG("flush cached frames"); 
     } while (got_frame); 



static int decode_packet(int *got_frame, int cached) 
{ 
    int ret = 0; 
    int decoded = pkt.size; 

    *got_frame = 0; 

    if (pkt.stream_index == audio_stream_idx) { 
     ret = avcodec_decode_audio4(audio_dec_ctx, frame, got_frame, &pkt); 
     if (ret < 0) { 
      LOG("Error decoding audio frame (%s)\n", av_err2str(ret)); 
      return ret; 
     } 

     decoded = FFMIN(ret, pkt.size); 

     if (*got_frame) { 
      size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(audio_dec_ctx->sample_fmt); 
      //decode packet nb_samples:4608, xx:2, unpadded_linesize: 9216 
      LOG("decode packet nb_samples:%d, xx:%d, unpadded_linesize: %d", 
        frame->nb_samples, av_get_bytes_per_sample(audio_dec_ctx->sample_fmt), unpadded_linesize); 
      fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file); 

      //int nb_sample = frame->nb_samples; 

      //fwrite(frame->extended_data[0], 1, nb_sample, audio_dst_file); 
      //fwrite(frame->extended_data[0] + nb_sample, 1, nb_sample, audio_dst_file); 

     } 
    } 

    if (*got_frame && api_mode == API_MODE_NEW_API_REF_COUNT) 
     av_frame_unref(frame); 

    return decoded; 
} 

ответ

1

Вы не описали проблемы, которую вы имеете, но от того, что вы пишете, я вижу две проблемы:

  1. вы не проверяя необработанный звуковой формат кадра , см. рамку->format (или audio_dec_ctx->sample_fmt). Вы пишете, как будто это были AV_SAMPLE_FMT_S16, но вы не проверить, что это
  2. ваш unpadded_linesize не умножается на количество каналов (см, например, Frame->channels)
+0

На самом деле, это является частью кода примера FFmpeg в demuxering_decodeing.c. и измените часть 'got_packet', замените unpadded_linesize на' frame-> linesize [0] ', тогда это будет работа. Спасибо – chaoqi

 Смежные вопросы

  • Нет связанных вопросов^_^