我们可以用ffmpeg来完成一些很有用的功能。这篇文章就来说说,怎样用ffmpeg来完成视频格式的转换。

首先在我们搭建好ffmpeg环境的基础上,如下链接所示

https://blog.csdn.net/laibowon/article/details/103746594

我们需要把输入的MP4视频文件转换为.avi格式的文件

主要是有两方面的问题:1.如何将输入文件传入给ffmpeg

2.如何调用ffmpeg进行格式转换

首先是第一个问题,在取得读写磁盘的权限以后,c++可以通过JNIEnv取得java层传递过来的绝对路径。

const char *in_filename;
in_filename =  env->GetStringUTFChars(str, &b);

通过传入两个地址,写入地址和写出地址,来告诉C层写入路径和输出路径分别是什么。

然后是第二步骤

需要引入的头文件有

jint _tmain(JNIEnv *env, int argc,jstring str,jstring output){const char* testfilepath =env->GetStringUTFChars(str,0);if(testfilepath == NULL){return -1;}env->ReleaseStringUTFChars(str, testfilepath);AVOutputFormat * ofmt = NULL;AVBitStreamFilterContext * vbsf = NULL;//定义输入、输出AVFormatContextAVFormatContext * ifmt_ctx = NULL, * ofmt_ctx = NULL;AVPacket pkt;const char *in_filename, *out_filename;int ret,i;int frame_index = 0;jboolean b=false;in_filename =  env->GetStringUTFChars(str, &b);//in_filename = "C:\\tst\\test.mp4";//input file URLint len = strlen(in_filename);out_filename = env->GetStringUTFChars(output, &b);av_register_all();//输入if((ret = avformat_open_input(&ifmt_ctx, in_filename,0,0)) < 0 )//打开媒体文件{char *buf;printf("Could not open input file.");goto end;}if((ret = avformat_find_stream_info(ifmt_ctx, 0 ))< 0 ){printf("Failed to go retrieve input stream information");goto end;}//MP4中使用的是H264编码,而H264编码有两种封装格式//一种是annexb模式,它是传统模式,有startcode,SPS和PPS在Element Stream中;//另一种是MP4模式,一般mp4、MKV、AVI都没有startcode,SPS和PPS以及其他信息被封装在容器中//每一帧前面都是这一帧的长度值,很多解码器只支持annexb模式,因此需要对MP4模式做转换//在ffmpeg中用h264_+mp4toannexb_fllter可以进行模式转换;使用-bsf h264_mp4toannexb就可以实现转换vbsf  = av_bitstream_filter_init("h264_mp4toannexb");av_dump_format(ifmt_ctx, 0, in_filename, 0);//初始化输出视频码流的AVFormatContextavformat_alloc_output_context2(&ofmt_ctx, NULL,NULL,out_filename);if (!ofmt_ctx) {printf("Could not create output contrxt\n");ret = AVERROR_UNKNOWN;goto end;}ofmt = ofmt_ctx -> oformat;for (int i = 0; i < ifmt_ctx->nb_streams; i++) {//通过输入的AVStream创建输出的AVStreamAVStream *in_stream = ifmt_ctx->streams[i];AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);if (!out_stream) {printf("Failed allocating out stream\n");ret = AVERROR_UNKNOWN;goto end;}//复制AVCodecContext的设置属性if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {printf("Faield to copy context from input to output \n");goto end;}out_stream->codec->codec_tag = 0;if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;}//输出信息av_dump_format(ofmt_ctx, 0, out_filename, 1);if (!(ofmt->flags & AVFMT_NOFILE)) {ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);if (ret < 0) {printf("Could not open output file'%s'", out_filename);goto end;}}//写文件头if (avformat_write_header(ofmt_ctx, NULL) < 0) {printf("Error occureed when opening output file\n");goto end;}while (1) {AVStream *in_stream, *out_stream;//       得到一个AVPacketret = av_read_frame(ifmt_ctx, &pkt);if (ret < 0) {break;}in_stream = ifmt_ctx->streams[pkt.stream_index];out_stream = ofmt_ctx->streams[pkt.stream_index];// 转换PTS/DTSpkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base,(AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base,(AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);pkt.pos = -1;if (pkt.stream_index == 0) {AVPacket fpkt = pkt;int a = av_bitstream_filter_filter(vbsf, out_stream->codec, NULL, &fpkt.data,&fpkt.size,pkt.data, pkt.size, pkt.flags & AV_PKT_FLAG_KEY);pkt.data = fpkt.data;pkt.size = fpkt.size;}//写Avpacketif (av_write_frame(ofmt_ctx, &pkt) < 0) {printf("Eroor mixing packet\n");break;}printf("Write %8d frames to output file\n", frame_index);av_packet_unref(&pkt);frame_index++;}av_write_trailer(ofmt_ctx);printf("succcess");end:avformat_close_input(&ifmt_ctx);if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE)) {avio_close(ofmt_ctx->pb);};avformat_free_context(ofmt_ctx);//clos out putprintf("end");return 0;}

利用FFmpeg完成 mp4格式转avi格式相关推荐

  1. 使用jsmpegjs前,先把利用 ffmpeg 将 MP4 格式的文件转换为 ts 格式

    利用 ffmpeg 将 MP4 格式的文件转换为 TS 格式 ffmpeg官网:http://ffmpeg.org/download.html ffmpeg下载地址: https://github.c ...

  2. 如何将html转换成avi,MP4如何转换AVI格式 如何将MP4转换成AVI

    从视频网站上面下载下来的视频是MP4格式的文件,这个时候想要把它转换成AVI格式的视频文件,那么有什么格式转换器可以把MP4转换成AVI格式的呢?我为你们找到了一款全能视频转换的工具,只要几步就能够轻 ...

  3. java利用FFMpeg将mp4转换为gif

    网上和官方资料整合 存在问题,在不丢帧的情况下转换后的gif会比原始mp4文件大很多. package jinx; import java.io.BufferedReader; import java ...

  4. 利用ffmpeg压缩屏幕图像为avi(录屏、压制)

    看了雷神关于ffmpeg方面的文章,结合自己最近做的一个基与cdc抓屏.vfw压制的录屏工具,就想改为采用ffmpeg来压制avi. 关于如何用ffmpeg压制视频相信大家都有一些见解,这里写这篇文章 ...

  5. 利用ffmpeg 把.mp4转换为.flv

    1. 下载安装 ffmpeg Download FFmpeg windows下载编译之后的exe文件,放到path环境变量中. Linux 下 tar xvf xxx.tar.bz2 ./config ...

  6. MKV是什么格式?怎么将mkv格式转换为avi格式?

    什么是mkv格式?mkv是一种新的多媒体封装格式,可以把视频.音频.字幕封装在一起.不知道大家有没有去酷狗上听过MV文件的,当你把上面的MV下载到本地电脑之后,会发现都是MKV格式的.那么想要把它转成 ...

  7. 通过adb录制视频并通过FFMPEG将MP4转换成GIF格式(二)

    通过上篇文章,我们得到了MP4文件,接下来,我们将把这个文件转化成gif图片,这篇不啰嗦,直接干货,本篇主要围绕ffmpeg来讲述,ffmpeg对于很多人来说就是只闻其声不见其人,是的,在本篇博客之前 ...

  8. 使用ffmpeg将MP4视频转换为m3u8格式

    一.什么是m3u8: M3U8视频格式也是一种M3U,只是它的编码格式是UTF-8格式.M3U用Latin-1字符集编码.M3U8格式特点是带有一个目录信息或文件. 二.为什么使用m3u8: 随着客户 ...

  9. ffmpeg 将MP4转为yuv 420格式

    在cmd的指令如下: ffmpeg -i "D:\VideoSequence\NewYork_3840x1920_30fps_8bit_420_erp.mp4" -s 3840x1 ...

最新文章

  1. python全栈开发基础【第二十三篇】线程
  2. Apache防DDOS模块mod_evasive的安装配置和使用
  3. python not in range1002无标题_Python中偶尔遇到的细节疑问(一):去除列名特殊字符、标准差出现nan、切片索引可超出范围、range步长、众数...
  4. UOJ#218. 【UNR #1】火车管理 线段树 主席树
  5. 默认情况下在MongoDB Shell中漂亮打印
  6. 使用js生成条形码以及二维码
  7. 技巧----时间优化
  8. freeldr 如何调用_BootMain的
  9. 智能优化算法:鹰栖息算法-附代码
  10. 怎样在html中写css样式,css样式应该怎么写?
  11. 马悦凌:从初级护士到“民间奇医”[9]
  12. Oblog博客系统存在SQL注入漏洞http://www.anqn.com
  13. 音频采集 via Media Foundation
  14. 查看GitHub仓库大小的几种方法
  15. 计算机网络实验三—— Cisco Packet Tracer 实验
  16. Leetcode994腐烂的橘子(广度搜索法)
  17. %02d得意思是什么?
  18. 智能云时代,谁来守护我们的安全?
  19. 全球医药研发支出及处方药市场发展前景分析:预计到2026年全球处方药销售额超过1.4万亿美元[图]
  20. 小学生计算机认识ppt,小学生认识计算机概要.ppt

热门文章

  1. 2.26 农夫,羊,菜和狼
  2. 前端—CSS层叠样式表
  3. 抖音上用计算机弹,抖音计算器音乐乐谱有哪些_抖音计算器音乐乐谱详细介绍_游戏吧...
  4. 立式数控铣床传动系统(论文+CAD图纸+开题报告+任务书+外文翻译+文献综述)
  5. IT培训学习需要注意的几大事项
  6. 雷军抖音直播破2亿,品牌看懂了什么
  7. Java时间相关的对象和方法
  8. 计算机在线考试系统教师端,局域网内的在线考试系统
  9. 牛仔新时尚-小程序开发案例-数据库篇
  10. 不肯努力 又不肯冒险 活该你屌丝一辈子