Nevermind. The audio data is being read correctly - I was confused by how my program was handling the data.<br /><br />Mark<br /><br /><br /><hr /><strong>Subject:</strong> [Libav-user] Can't read audio from file<br /><strong>Date:</strong> Sat, 11 May 2019 08:00:25 -0400<br /><strong>From:</strong> Mark McKay <mark@kitfox.com><br /><strong>To:</strong> "This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter." <libav-user@ffmpeg.org><br /><strong>Reply-To:</strong> "This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter." <libav-user@ffmpeg.org><br /><!-- html ignored --><!-- head ignored --><!-- meta ignored -->
<p>I'm trying to decode the audio track from an mp4 file that can play audio in other media players. However, when I look at the audio in the frame that I decode, it's all set to 0 (or sometimes -0. The format type is AV_SAMPLE_FMT_FLTP).<br /><br />I've been using decode_audio.c to help guild me in writing the code. My packet decoding looks like:<br /><br /> int err = avcodec_send_packet(aCodecCtx, &packet);<br /> if (err < 0)<br /> {<br /> qDebug() << "Error sending packet to decoder";<br /> return;<br /> }<br /> <br /> while (err >= 0)<br /> {<br /> err = avcodec_receive_frame(aCodecCtx, aFrame);<br /> if (err == AVERROR(EAGAIN) || err == AVERROR_EOF)<br /> return;<br /><br /> if (err < 0)<br /> {<br /> qDebug() << "Error decoding packet: " << err;<br /> return;<br /> }<br /><br /> int data_size = av_get_bytes_per_sample(aCodecCtx->sample_fmt);<br /> if (data_size < 0) {<br /> /* This should not occur, checking just for paranoia */<br /> fprintf(stderr, "Failed to calculate data size\n");<br /> exit(1);<br /> }<br /><br /> for (int i = 0; i < aFrame->nb_samples; i++)<br /> for (int ch = 0; ch < aCodecCtx->channels; ch++)<br /> {<br /> float val = 0;<br /> switch (aCodecCtx->sample_fmt)<br /> {<br /> ...<br /> case AV_SAMPLE_FMT_FLT:<br /> case AV_SAMPLE_FMT_FLTP:<br /> {<br /> uint8_t *byteBuffer = aFrame->data[ch];<br /> float* buffer = (float *)byteBuffer;<br /> val = buffer[i];<br /> break;<br /> }<br /> ...<br /> }<br /> <br /> _audioBuffer.write((const char *)&val, sizeof(float));<br /> }<br /> }<br /><br />Basically I'm trying to write the audio data as a series of floats to an output file. I'm not getting any error codes, but the data is all 0 or values with small exponents. <br /><br />The nm_samples is 1024, the data format is AV_SAMPLE_FMT_FLTP and there are 2 channels. Is there something I'm doing wrong here?</p>
<p> </p>
<div>
<pre>---
http://www.kitfox.com</pre>
</div>