gcc -g -o getacc b.cpp -lavformat -lavcodec -lpthread -lm -lz -lavutil -lstdc++
./geth264 xxx.mp4 xxx.acc
#include <exception>
#include <iostream>
extern "C"
{
#include <stdio.h>
#include <libavformat/avformat.h>
}
av_always_inline char* wrap_av_err2str(int errnum)
{
static char str[AV_ERROR_MAX_STRING_SIZE];
memset(str, 0, sizeof(str));
return av_make_error_string(str, AV_ERROR_MAX_STRING_SIZE, errnum);
}
int main(int argc,char *argv[])
{
int ret = 0;
int jumpNumber;
AVPacket pkt;
char* src = NULL;
char* dst = NULL;
int audio_index,len;
FILE* dst_fd = NULL;
src = argv[1];
dst = argv[2];
AVFormatContext *fmt_ctx = NULL;
if(argc < 3 || !src || !dst){
jumpNumber = -1;
goto __END;
}
av_log_set_level(AV_LOG_INFO);
av_register_all();
std::cout <<"将要打开的文件:"<< src << ",输出的文件:" << dst << " \n";
ret = avformat_open_input(&fmt_ctx, src, NULL, NULL);
if(ret < 0){
jumpNumber = -2;
goto __END;
}
dst_fd = fopen(dst, "wb");
if(!dst_fd)
{
jumpNumber = -3;
goto __END;
}
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){
jumpNumber = -4;
goto __END;
}
audio_index = ret;
av_init_packet(&pkt);
while(av_read_frame(fmt_ctx, &pkt) >= 0){
if(pkt.stream_index == audio_index){
len = fwrite(pkt.data,1, pkt.size, dst_fd);
if(len != pkt.size){
jumpNumber = -5;
av_log(NULL,AV_LOG_WARNING,"warning ,length of data isn't equal size of pkt \n");
}
}
av_packet_unref(&pkt);
}
__END:
switch(jumpNumber){
case -1:
av_log(NULL,AV_LOG_ERROR,"input params error\n");break;
case -2:
av_log(NULL,AV_LOG_ERROR,"Can't open file: %s \n",wrap_av_err2str(ret));break;
case -3:
av_log(NULL,AV_LOG_ERROR,"Can't open out file \n");break;
case -4:
av_log(NULL,AV_LOG_ERROR,"can't find the best stream\n");break;
}
try{
avformat_close_input(&fmt_ctx);
fclose(dst_fd);
}catch(...){}
return ret;
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-7970.html