ffmpeg音频解码成wav格式实现代码
时间: 2023-05-12 10:06:48 浏览: 356
以下是使用FFmpeg将音频解码为WAV格式的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#include <math.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/frame.h>
#include <libavutil/opt.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswresample/swresample.h>
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
FILE *outfile)
{
int i, ch;
int ret, data_size;
/* send the packet with the compressed data to the decoder */
ret = avcodec_send_packet(dec_ctx, pkt);
if (ret < 0) {
fprintf(stderr, "Error submitting the packet to the decoder\n");
exit(1);
}
/* read all the output frames (in general there may be any number of them) */
while (ret >= 0) {
ret = avcodec_receive_frame(dec_ctx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error during decoding\n");
exit(1);
}
data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);
if (data_size < 0) {
/* This should not occur, checking just for paranoia */
fprintf(stderr, "Failed to calculate data size\n");
exit(1);
}
for (i = 0; i < frame->nb_samples; i++)
for (ch = 0; ch < dec_ctx->channels; ch++)
fwrite(frame->data[ch] + data_size*i, 1, data_size, outfile);
}
}
int main(int argc, char **argv)
{
AVCodec *codec;
AVCodecContext *codec_ctx = NULL;
AVCodecParserContext *parser = NULL;
AVFormatContext *fmt_ctx = NULL;
AVPacket *pkt = NULL;
AVFrame *frame = NULL;
uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
int inbuf_size;
int64_t pts;
int ret;
int i;
if (argc <= 1) {
fprintf(stderr, "Usage: %s <input file>\n", argv[0]);
exit(0);
}
/* register all the codecs */
av_register_all();
/* allocate the input buffer */
pkt = av_packet_alloc();
if (!pkt) {
fprintf(stderr, "Failed to allocate packet\n");
exit(1);
}
/* open the input file */
ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL);
if (ret < 0) {
fprintf(stderr, "Cannot open input file '%s'\n", argv[1]);
exit(1);
}
/* retrieve stream information */
ret = avformat_find_stream_info(fmt_ctx, NULL);
if (ret < 0) {
fprintf(stderr, "Cannot find stream information\n");
exit(1);
}
/* select the audio stream */
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
if (ret < 0) {
fprintf(stderr, "Cannot find an audio stream in the input file\n");
exit(1);
}
int audio_stream_idx = ret;
/* allocate the codec context */
codec_ctx = avcodec_alloc_context3(codec);
if (!codec_ctx) {
fprintf(stderr, "Failed to allocate codec context\n");
exit(1);
}
/* fill the codec context based on the stream information */
ret = avcodec_parameters_to_context(codec_ctx, fmt_ctx->streams[audio_stream_idx]->codecpar);
if (ret < 0) {
fprintf(stderr, "Failed to copy codec parameters to codec context\n");
exit(1);
}
/* init the codec context */
ret = avcodec_open2(codec_ctx, codec, NULL);
if (ret < 0) {
fprintf(stderr, "Failed to open codec\n");
exit(1);
}
/* allocate the frame */
frame = av_frame_alloc();
if (!frame) {
fprintf(stderr, "Failed to allocate frame\n");
exit(1);
}
/* init the packet parser */
parser = av_parser_init(codec_ctx->codec_id);
if (!parser) {
fprintf(stderr, "Failed to init packet parser\n");
exit(1);
}
/* open the output file */
FILE *outfile = fopen("output.wav", "wb");
if (!outfile) {
fprintf(stderr, "Failed to open output file\n");
exit(1);
}
/* read packets from the input file */
while (1) {
/* get more data from the input file */
ret = av_read_frame(fmt_ctx, pkt);
if (ret < 0)
break;
/* if this is not the audio stream, ignore it */
if (pkt->stream_index != audio_stream_idx) {
av_packet_unref(pkt);
continue;
}
/* send the packet to the parser */
inbuf_size = pkt->size;
memcpy(inbuf, pkt->data, inbuf_size);
while (inbuf_size > 0) {
ret = av_parser_parse2(parser, codec_ctx, &pkt->data, &pkt->size,
inbuf, inbuf_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
if (ret < 0) {
fprintf(stderr, "Error while parsing\n");
exit(1);
}
inbuf += ret;
inbuf_size -= ret;
/* if we have a complete frame, decode it */
if (pkt->size > 0) {
decode(codec_ctx, pkt, frame, outfile);
}
}
av_packet_unref(pkt);
}
/* flush the decoder */
decode(codec_ctx, NULL, frame, outfile);
/* close the output file */
fclose(outfile);
/* free the resources */
av_parser_close(parser);
avcodec_free_context(&codec_ctx);
av_frame_free(&frame);
av_packet_free(&pkt);
avformat_close_input(&fmt_ctx);
return 0;
}
```
这个程序使用FFmpeg库将音频文件解码为WAV格式,并将解码后的数据写入到一个输出文件中。你可以将输入文件的路径作为程序的参数来运行它。
阅读全文
相关推荐
















