Advertisement
DavidNorgren

Untitled

Aug 17th, 2015
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. // Allocate and init re-usable frames
  2. audioFrameDecoded = av_frame_alloc();
  3. if (!audioFrameDecoded)
  4.     die("Could not allocate audio frame");
  5.  
  6. audioFrameDecoded->format = fileCodecContext->sample_fmt;
  7. audioFrameDecoded->channel_layout = fileCodecContext->channel_layout;
  8. audioFrameDecoded->channels = fileCodecContext->channels;
  9. audioFrameDecoded->sample_rate = fileCodecContext->sample_rate;
  10.  
  11. audioFrameConverted = av_frame_alloc();
  12. if (!audioFrameConverted)
  13.     die("Could not allocate audio frame");
  14.  
  15. audioFrameConverted->nb_samples = audioCodecContext->frame_size;
  16. audioFrameConverted->format = audioCodecContext->sample_fmt;
  17. audioFrameConverted->channel_layout = audioCodecContext->channel_layout;
  18. audioFrameConverted->channels = audioCodecContext->channels;
  19. audioFrameConverted->sample_rate = audioCodecContext->sample_rate;
  20.  
  21. AVPacket inPacket;
  22. av_init_packet(&inPacket);
  23. inPacket.data = NULL;
  24. inPacket.size = 0;
  25.  
  26. int frameFinished = 0;
  27.  
  28. while (av_read_frame(formatContext, &inPacket) >= 0) {
  29.  
  30.     if (inPacket.stream_index == streamId) {
  31.  
  32.         int len = avcodec_decode_audio4(fileCodecContext, audioFrameDecoded, &frameFinished, &inPacket);
  33.  
  34.         if (frameFinished) {
  35.  
  36.             // Convert
  37.  
  38.             uint8_t *convertedData=NULL;
  39.  
  40.             if (av_samples_alloc(&convertedData,
  41.                          NULL,
  42.                          audioCodecContext->channels,
  43.                          audioFrameConverted->nb_samples,
  44.                          audioCodecContext->sample_fmt, 0) < 0)
  45.                 die("Could not allocate samples");
  46.  
  47.             int outSamples = swr_convert(swrContext,
  48.                              &convertedData,
  49.                              audioFrameConverted->nb_samples,
  50.                              (const uint8_t **)audioFrameDecoded->data,
  51.                              audioFrameDecoded->nb_samples);
  52.             if (outSamples < 0)
  53.                 die("Could not convert");
  54.  
  55.             size_t buffer_size = av_samples_get_buffer_size(NULL,
  56.                                     audioCodecContext->channels,
  57.                                     audioFrameConverted->nb_samples,
  58.                                     audioCodecContext->sample_fmt,
  59.                                     0);
  60.             if (buffer_size < 0)
  61.                 die("Invalid buffer size");
  62.  
  63.             if (avcodec_fill_audio_frame(audioFrameConverted,
  64.                              audioCodecContext->channels,
  65.                              audioCodecContext->sample_fmt,
  66.                              convertedData,
  67.                              buffer_size,
  68.                              0) < 0)
  69.                 die("Could not fill frame");
  70.  
  71.             AVPacket outPacket;
  72.             av_init_packet(&outPacket);
  73.             outPacket.data = NULL;
  74.             outPacket.size = 0;
  75.  
  76.             if (avcodec_encode_audio2(audioCodecContext, &outPacket, audioFrameConverted, &frameFinished) < 0)
  77.                 die("Error encoding audio frame");
  78.  
  79.             if (frameFinished) {
  80.                 outPacket.stream_index = audioStream->index;
  81.  
  82.                 if (av_interleaved_write_frame(outContext, &outPacket) != 0)
  83.                     die("Error while writing audio frame");
  84.  
  85.                 av_free_packet(&outPacket);
  86.             }
  87.         }
  88.     }
  89. }
  90.  
  91. av_frame_free(&audioFrameConverted);
  92. av_frame_free(&audioFrameDecoded);
  93. av_free_packet(&inPacket);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement