使用FFMpeg抽取多媒体文件中音频数据
#include<libavutil/avutil.h>
#include<libavformat/avformat.h>
#include<stdio.h>
int main(int argc, char *argv[]){
int ret;
int audio_index;
int length;
AVFormatContext *fmt_ctx = NULL;
char *src = argv[1];
char *dst = argv[2];
AVPacket pkt;
FILE *dst_fd = NULL;
av_log_set_level(AV_LOG_INFO);
//注册api
av_register_all();
//输入流
if(argc < 3) {
av_log(NULL, AV_LOG_ERROR, "the count of params should be more than three!\n");
return -1;
}
// src = argv[1];
// dst = argv[2];
ret = avformat_open_input(&fmt_ctx, src, NULL, NULL);
if(ret < 0 ){
av_log(NULL, AV_LOG_ERROR, "Can't open file: %s\n",av_err2str(ret));
return -1;
}
av_dump_format(fmt_ctx, 0, src, 0);
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if(ret < 0 ){
av_log(NULL, AV_LOG_ERROR, "Can't find best stream!\n");
avformat_close_input(&fmt_ctx);
return -1;
}
dst_fd = fopen(dst, "wb");
if(!dst_fd){
av_log(NULL, AV_LOG_ERROR, "Can't open out file!\n");
return -1;
}
audio_index = ret;
av_init_packet(&pkt);
while(av_read_frame(fmt_ctx, &pkt) >= 0 ){
if(pkt.stream_index == audio_index){
length = fwrite(pkt.data, 1, pkt.size, dst_fd);
if(length != pkt.size){
av_log(NULL, AV_LOG_WARNING, "Warning, write data of length is not equal to pkt size\n");
}
}
av_packet_unref(&pkt);
}
if(dst_fd){
fclose(dst_fd);
}
avformat_close_input(&fmt_ctx);
return 0;
}