10.FFmpeg学习笔记 - 解复用分离mp3码流

本篇文章目标是给定一个视频文件(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即可,无需其他操作,即可播放。

猜你喜欢

转载自blog.csdn.net/whoyouare888/article/details/94383215