本篇文章目标是给定一个视频文件(mp4/flv/ts/mkv),从中分离出mp3码流。
void demux(void)
{
const char *src_filename = "/Users/zhw/Desktop/resource/sintel_h264_mp3.mkv";
const char *audio_dst_filename = "/Users/zhw/Desktop/sintel.mp3";
int audio_index;
AVFormatContext *ifmt_ctx = NULL;
AVPacket pkt;
/* open input file, and allocate format context */
if (avformat_open_input(&ifmt_ctx, src_filename, NULL, NULL) < 0) {
fprintf(stderr, "Could not open source file %s\n", src_filename);
exit(1);
}
/* retrieve stream information */
if (avformat_find_stream_info(ifmt_ctx, NULL) < 0) {
fprintf(stderr, "Could not find stream information\n");
exit(1);
}
audio_index = av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if (audio_index < 0) {
fprintf(stderr, "Could not find %s stream\n",
av_get_media_type_string(AVMEDIA_TYPE_AUDIO));
return;
}
FILE *out_file = fopen(audio_dst_filename, "wb");
if (!out_file) {
fprintf(stderr, "open out_file error");
return;
}
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
while (av_read_frame(ifmt_ctx, &pkt) >= 0) {
if (pkt.stream_index == audio_index) {
fwrite(pkt.data, 1, pkt.size, out_file);
}
av_packet_unref(&pkt);
}
printf("finish\n");
}
可以看到,分离mp3音频码流的时候,直接存储AVPacket的data即可,无需其他操作,即可播放。