本程序实现转码一个普通视频文件为视频mpeg4,音频mp3的功能

#include <avcodec.h>
#include <avformat.h>
#include <stdio.h>
#include <avutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(int argc,char **argv)
{   const char *input_file_name="/root/movies/ddh1.mpg";av_register_all();//注册库中所有可用的文件格式和编码器AVFormatContext *ic;//输入文件处理部分ic=av_alloc_format_context();if(av_open_input_file(&ic,input_file_name,NULL,0,NULL)!=0){printf("can't open the file %s\n",input_file_name);exit(1);}//打开输入文件if(av_find_stream_info(ic)<0){printf("can't find suitable codec parameters\n");exit(1);}//取出流信息dump_format(ic,0,input_file_name,0);//列出输入文件的相关流信息int i;int videoindex=-1;int audioindex=-1;for(i=0;i<ic->nb_streams;i++){    if(ic->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO){videoindex=i;//printf("video\n");}else if(ic->streams[i]->codec->codec_type==CODEC_TYPE_AUDIO){//printf("audio\n");audioindex=i;}}if(videoindex==-1){printf("can't find video stream\n");exit(1);}//没有找到视频流AVCodecContext *vCodecCtx;vCodecCtx=ic->streams[videoindex]->codec;//取得视频流编码上下文指针AVCodec *vCodec;vCodec=avcodec_find_decoder(vCodecCtx->codec_id);if(vCodec==NULL){printf("can't find suitable video decoder\n");exit(1);}//找到合适的视频解码器if(avcodec_open(vCodecCtx,vCodec)<0){printf("can't open the video decoder\n");exit(1);}//打开该视频解码器if(audioindex==-1){printf("can't find audio stream\n");exit(1);}//没有找到音频流AVCodecContext *aCodecCtx;aCodecCtx=ic->streams[audioindex]->codec;AVCodec *aCodec;aCodec=avcodec_find_decoder(aCodecCtx->codec_id);if(aCodec==NULL){printf("can't find suitable audio decoder\n");exit(1);}//找到合适的音频解码器if(avcodec_open(aCodecCtx,aCodec)<0){printf("can't open the audio decoder\n");exit(1);}//打开该音频解码器
//下面为输出文件处理部分const char *output_file_name="/root/123.avi";AVOutputFormat *fmt;AVFormatContext *oc;AVCodecContext *oVcc,*oAcc;AVCodec *oVc,*oAc;AVStream *video_st,*audio_st;AVFrame *oVFrame,*oAFrame;double video_pts;oVFrame=avcodec_alloc_frame();fmt=guess_format(NULL,output_file_name,NULL);if(!fmt){printf("could not deduce output format from outfile extension\n");exit(0);}//判断是否可以判断输出文件的编码格式oc=av_alloc_format_context();if(!oc){printf("Memory error\n");exit(0);}oc->oformat=fmt;pstrcpy(oc->filename,sizeof(oc->filename),output_file_name);video_st=av_new_stream(oc,0);if(!video_st){printf("could not alloc video stream\n");exit(0);}oVcc=avcodec_alloc_context();oVcc=video_st->codec;oVcc->codec_id=CODEC_ID_MPEG4;oVcc->codec_type=CODEC_TYPE_VIDEO;oVcc->bit_rate=2500000;oVcc->width=704;oVcc->height=480;oVcc->time_base=vCodecCtx->time_base;oVcc->gop_size=vCodecCtx->gop_size;//oVcc->pix_fmt=vCodecCtx->pix_fmt;oVcc->pix_fmt=vCodecCtx->pix_fmt;oVcc->max_b_frames=vCodecCtx->max_b_frames;video_st->r_frame_rate=ic->streams[videoindex]->r_frame_rate;audio_st=av_new_stream(oc,oc->nb_streams);if(!audio_st){printf("could not alloc audio stream\n");exit(0);}  avcodec_get_context_defaults2(audio_st->codec,CODEC_TYPE_AUDIO);oAcc=avcodec_alloc_context();oAcc=audio_st->codec;oAcc->codec_id=CODEC_ID_MP3;oAcc->codec_type=CODEC_TYPE_AUDIO;oAcc->bit_rate=aCodecCtx->bit_rate;oAcc->sample_rate=aCodecCtx->sample_rate;oAcc->channels=2;if (av_set_parameters(oc, NULL) < 0) {printf( "Invalid output format parameters\n");                         exit(0);                               }//设置必要的输出参数strcpy(oc->title,ic->title);strcpy(oc->author,ic->author);strcpy(oc->copyright,ic->copyright);strcpy(oc->comment,ic->comment);strcpy(oc->album,ic->album);oc->year=ic->year;oc->track=ic->track;strcpy(oc->genre,ic->genre);dump_format(oc,0,output_file_name,1);//列出输出文件的相关流信息oVc=avcodec_find_encoder(CODEC_ID_MPEG4);if(!oVc){printf("can't find suitable video encoder\n");exit(0);}//找到合适的视频编码器if(avcodec_open(oVcc,oVc)<0){printf("can't open the output video codec\n");exit(0);}//打开视频编码器oAc=avcodec_find_encoder(CODEC_ID_MP3);if(!oAc){printf("can't find suitable audio encoder\n");exit(0);}//找到合适的音频编码器if(avcodec_open(oAcc,oAc)<0){printf("can't open the output audio codec");exit(0);}//打开音频编码器/*if(url_exist(output_file_name)){printf("the output file name %s has exist,please select other\n",output_file_name);exit(0);}//判断该输出文件是否已经存在*/if (!(oc->flags & AVFMT_NOFILE)){if(url_fopen(&oc->pb,output_file_name,URL_WRONLY)<0){printf("can't open the output file %s\n",output_file_name);exit(0);}//打开输出文件}if(!oc->nb_streams){fprintf(stderr,"output file dose not contain any stream\n");exit(0);}//查看输出文件是否含有流信息if(av_write_header(oc)<0){fprintf(stderr, "Could not write header for output file\n");exit(1);}[/i][/i]
AVPacket packet;uint8_t *ptr,*out_buf;int out_size;static short *samples=NULL;static unsigned int samples_size=0;uint8_t *video_outbuf,*audio_outbuf;int video_outbuf_size,audio_outbuf_size;video_outbuf_size=400000;video_outbuf= (unsigned char *) malloc(video_outbuf_size);audio_outbuf_size = 10000;audio_outbuf = av_malloc(audio_outbuf_size);int flag;int frameFinished;int len;int frame_index=0,ret;while(av_read_frame(ic,&packet)>=0)//从输入文件中读取一个包{if(packet.stream_index==videoindex)//判断是否为当前视频流中的包{len=avcodec_decode_video(vCodecCtx,oVFrame,&frameFinished,packet.data,packet.size);//若为视频包,解码该视频包if(len<0){printf("Error while decoding\n");exit(0);}if(frameFinished)//判断视频祯是否读完{fflush(stdout);oVFrame->pts=av_rescale(frame_index,AV_TIME_BASE*(int64_t)oVcc->time_base.num,oVcc->time_base.den);oVFrame->pict_type=0;out_size = avcodec_encode_video(oVcc, video_outbuf, video_outbuf_size, oVFrame);   if (out_size > 0)            {                   AVPacket pkt;               av_init_packet(&pkt);                               if(oVcc->coded_frame && oVcc->coded_frame->key_frame)                                       pkt.flags |= PKT_FLAG_KEY;                                        pkt.flags = packet.flags;                      pkt.stream_index= video_st->index;                                               pkt.data= video_outbuf;                                                         pkt.size= out_size;                                             ret=av_write_frame(oc, &pkt);                                       }frame_index++;}elseret=av_write_frame(oc, &packet); //img_convert((AVPicture *)vFrame, PIX_FMT_RGB24, (AVPicture*)oVFrame, oVcc->pix_fmt,oVcc->width,oVcc-
>height);//SaveFrame(vFrame,oVcc->width,oVcc->height,frame_index); if(ret!=0){printf("while write video frame error\n");exit(0);}}else if(packet.stream_index==audioindex){len=packet.size;ptr=packet.data;int ret=0;while(len>0){out_buf=NULL;out_size=0;if(&packet)samples=av_fast_realloc(samples,&samples_size,FFMAX(packet.size*sizeof
(*samples),AVCODEC_MAX_AUDIO_FRAME_SIZE));out_size=samples_size;ret=avcodec_decode_audio(aCodecCtx,samples,&out_size,ptr,len);//若为音频包,解码该音频包if(ret<0){printf("while decode audio failure\n");exit(0);}fflush(stdout);ptr+=ret;len-=ret;if(out_size<=0)continue;out_buf=(uint8_t *)samples;AVPacket pkt;av_init_packet(&pkt);pkt.size= avcodec_encode_audio(oAcc, audio_outbuf, audio_outbuf_size, out_buf);pkt.pts= av_rescale_q(oAcc->coded_frame->pts, oAcc->time_base, audio_st->time_base);pkt.flags |= PKT_FLAG_KEY;pkt.stream_index= audioindex;pkt.data= audio_outbuf;if (av_write_frame(oc, &pkt) != 0) {fprintf(stderr, "Error while writing audio frame\n");exit(1);}}} av_free_packet(&packet);}
av_write_trailer(oc);
for(i = 0; i < oc->nb_streams; i++)
{            av_freep(&oc->streams[i]->codec);                       av_freep(&oc->streams[i]);
}
url_fclose(oc);
av_free(oc);
av_free(oVFrame);
av_free(out_buf);
avcodec_close(vCodecCtx);
avcodec_close(aCodecCtx);
av_close_input_file(ic);
}

ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)相关推荐

  1. 如何把视频文件转换为视频二维码的完整教程

    如何把视频文件转换为视频二维码的完整教程 二维码已经不经意间快速地融入了我们的生活,我们可以通过扫描二维码来添加好友.付款等等, 那么,如何让视频生成二维码直接免费观看和实现分享呢? 「 视频二维码 ...

  2. python传输视频文件_Python视频传输

    ubuntu16.04+python2+opencv (一) 开发前的准备工作 sudo apt-get install python-pip pip install numpy pip instal ...

  3. mysql服务器存储视频文件,把视频文件直接存储到mysql数据库的方法

    导入jpg.png等图片类似. 创建一个测试表test,使用longblob或者mediumblob 1CREATE TABLE test (id INTEGER NOT NULL PRIMARY K ...

  4. html如何调用短视频文件,短视频脚本怎么写?3种短视频脚本的创意写作方法干货分享!...

    短视频的崛起给了很多人发挥才能.自主创业的机会.而要想从短视频流量巨海中脱颖而出,除了本身所具备的才能外,还要求我们在短视频内容创作时有令人惊叹的创意. 其中,短视频脚本创作就是一个关键环节. 那么, ...

  5. python播放本地视频_python opencv 读取本地视频文件 修改ffmpeg的方法

    Python + opencv 读取视频的三种情况: 情况一:通过摄像头采集视频 情况二:通过本地视频文件获取视频 情况三:通过摄像头录制视频,再读取录制的视频 摄像头采集.本地视频文件的读取.写视频 ...

  6. 使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件

    原:http://blog.chinaunix.net/uid-11344913-id-4282729.html 使用 ffmpeg 解码多媒体文件之前,首先需要了解一些基本的概念: 容器:多媒体文件 ...

  7. ffmpeg解码视频文件并播放

    最近学习了一下如何使用ffmpeg解码音视频,网上的教程挺多但是也挺杂的,搞了好几天,明白了ffmpeg解码音视频的大体流程,这里记录一下ffmpeg解码视频并播放音视频的例子,但并没有做音频.视频播 ...

  8. 利用python加上ffmpeg,ffmpy,做一个音视频格式转换器

    利用python加上ffmpeg,可以做一个简单的音乐或者视频格式转换器. 可以利用PyQt5做界面,本例中比较简单: 流程非常简单,点击"选择源文件",选取要转换的音频或者视频文 ...

  9. PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...

最新文章

  1. [AutoMapper]反射自动注册AutoMapper Profile
  2. 动态规划——洛谷_P1057传球游戏
  3. ACL2020 | 使用强化学习为机器翻译生成对抗样本
  4. Python自动化开发学习2
  5. 转载:k2pdfopt详细教程-让kindle看遍所有pdf
  6. s9 Linux 进程管理命令
  7. 【Python基础】11_Python中的字符串
  8. JAGUARSDN1网络的开机自动启动 禁用,WIFI模块的启动关闭控制
  9. 逻辑回归算法_算法逻辑回归
  10. sysstat工具的用法
  11. 超简单友盟分享(微信、QQ)+ 原生微信分享
  12. linux版小米随身WIFI驱动,在官网中您就可以下载小米随身wifi的驱动程序了
  13. 付费音乐如何下载???
  14. kpi绩效考核流程图_松松客服KPI绩效考核表经验分享
  15. 三年打造AI芯片黑科技,IBM“狩猎女神之矛”将撬动企业混合云
  16. 视频聊天开发包的介绍
  17. JAVA 实现《捕鱼达人》游戏
  18. idea modules中Sources介绍
  19. 查询邮件服务器MX记录
  20. 智慧农业大棚物联网解决方案

热门文章

  1. wex5 java服务器_wex5教程 宝塔面板+lnmp+wex5项目部署
  2. 面试中常被问到(九)STL迭代器失效问题
  3. xshell远程连接服务
  4. 开源软件开发导论第一次作业——针对开源的五个问题
  5. Dalvik和ART
  6. 算法笔记(XI) 算法分析与勒贝格积分
  7. MFC单文档项目动态绘制十字线
  8. 链表操作——两数相加
  9. 计算机用户原始密码是多少,网上邻居的默认密码一般是多少
  10. PHP生成svg矢量图格式的二维码,php 实现svg转化png格式的方法分析