ffmpeg只播放MP4文件的音频解码demo
时间: 2023-07-04 21:28:46 浏览: 155
demo4.rar:《第4课 FFmpeg播放本地mp4文件》对应源文件
5星 · 资源好评率100%
好的,以下是一个基于FFmpeg的简单的只播放MP4文件的音频解码demo,供您参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
int main(int argc, char **argv)
{
AVFormatContext *fmt_ctx;
AVCodecContext *codec_ctx;
AVCodec *codec;
AVPacket pkt;
AVFrame *frame;
int stream_index;
int ret;
// 打开输入文件
ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL);
if (ret < 0) {
printf("Error: Could not open input file.\n");
return -1;
}
// 获取流信息
ret = avformat_find_stream_info(fmt_ctx, NULL);
if (ret < 0) {
printf("Error: Could not find stream information.\n");
return -1;
}
// 查找音频流
stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
if (stream_index < 0) {
printf("Error: Could not find audio stream in input file.\n");
return -1;
}
// 打开音频解码器
codec_ctx = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codec_ctx, fmt_ctx->streams[stream_index]->codecpar);
ret = avcodec_open2(codec_ctx, codec, NULL);
if (ret < 0) {
printf("Error: Could not open audio codec.\n");
return -1;
}
// 创建音频帧
frame = av_frame_alloc();
if (!frame) {
printf("Error: Could not allocate audio frame.\n");
return -1;
}
// 逐帧读取音频数据并解码
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
if (pkt.stream_index == stream_index) {
ret = avcodec_send_packet(codec_ctx, &pkt);
if (ret < 0) {
printf("Error: Could not send audio packet for decoding.\n");
break;
}
while (ret >= 0) {
ret = avcodec_receive_frame(codec_ctx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
} else if (ret < 0) {
printf("Error: Could not receive decoded audio frame.\n");
break;
}
// 处理解码后的音频帧数据,这里可以将其写入到文件中
}
}
av_packet_unref(&pkt);
}
// 释放资源
av_frame_free(&frame);
avcodec_free_context(&codec_ctx);
avformat_close_input(&fmt_ctx);
return 0;
}
```
您需要将以上代码保存到一个文件中,例如`audio_decoder.c`,然后使用以下命令编译生成可执行文件:
```sh
gcc -o audio_decoder audio_decoder.c -lavformat -lavcodec -lavutil
```
其中,`-lavformat`、`-lavcodec`、`-lavutil`参数用于链接FFmpeg库。
最后,您可以使用以下命令运行该demo:
```sh
./audio_decoder input.mp4
```
其中,`input.mp4`为您想要解码的MP4音频文件。
阅读全文