转换视频格式步骤

1、打开输入文件;
2、创建并打开一个空文件存储 flv 格式音视频数据;
3、遍历输入文件的每一路流,每个输入流对应创建一个输出流,并将输入流中的编解码参数直接拷贝到输出流中;
4、写入新的多媒体文件的头;
5、在循环遍历输入文件的每一帧,对每一个packet进行时间基的转换;
6、写入新的多媒体文件;
7、给新的多媒体文件写入文件尾;
8、释放相关资源。

相关API

文件操作
相关API

源码:

#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>#include "ConverterVideo.h"static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt, const char *tag) {AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base;printf("%s: pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",tag,av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),pkt->stream_index);
}int converterVideo(const char *in_filename, const char *out_filename) {AVOutputFormat *outfmt = NULL; //输出格式AVFormatContext *infmt_ctx = NULL, *outfmt_ctx = NULL;//输入、输出上下文AVPacket pkt;int ret , i;int stream_index = 0;int *stream_mapping = NULL;//数组用于存放输出文件流的Indexint stream_mapping_size = 0;//输入文件中流的总数量av_register_all();//打开输入文件为infmt_ctx分配内存ret = avformat_open_input(&infmt_ctx, in_filename, 0, 0);if (ret < 0) {fprintf(stderr, "Could not open input file '%s'", in_filename);goto end;}//检索输入文件的流信息ret = avformat_find_stream_info(infmt_ctx, NULL);if (ret < 0) {fprintf(stderr, "Failed to retrieve input stream information");goto end;}//打印输入文件相关信息av_dump_format(infmt_ctx, 0, in_filename, 0);//为输出上下文环境分配内存avformat_alloc_output_context2(&outfmt_ctx, NULL, NULL, out_filename);if (!outfmt_ctx) {fprintf(stderr, "Could not create output context\n");ret = AVERROR_UNKNOWN;goto end;}//输入文件流的数量stream_mapping_size = infmt_ctx->nb_streams;//分配stream_mapping_size段内存,每段内存大小是sizeof(*stream_mapping)->如果有音频和视频,那就是,2段为整型的内存stream_mapping = av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping));if (!stream_mapping) {ret = AVERROR(ENOMEM);goto end;}//输出文件格式outfmt = outfmt_ctx->oformat;//遍历输入文件中的每一路流,对于每一路流都要创建一个新的流进行输出for (i = 0; i < infmt_ctx->nb_streams; i++) {AVStream *out_stream = NULL;//输出流AVStream *in_stream = infmt_ctx->streams[i];//输入流AVCodecParameters *in_codecpar = in_stream->codecpar;//输入流的编解码参数//只保留音频、视频、字幕流,其他流不要if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO &&in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO &&in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) {stream_mapping[i] = -1;continue;}//对于输出流的index重新编号stream_mapping[i] = stream_index++;//创建一个对应的输出流out_stream = avformat_new_stream(outfmt_ctx, NULL);if (!out_stream) {fprintf(stderr, "Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}//直接将输入流的编解码参数拷贝到输出流中ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);if (ret < 0) {fprintf(stderr, "Failed to copy codec parameters\n");goto end;}out_stream->codecpar->codec_tag = 0;}//打印要输出的对媒体文件的详细信息av_dump_format(outfmt_ctx, 0, out_filename, 1);if (!(outfmt->flags & AVFMT_NOFILE)) {ret = avio_open(&outfmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);if (ret < 0) {fprintf(stderr, "Could not open output file '%s'", out_filename);goto end;}}//写入新的多媒体文件的头ret = avformat_write_header(outfmt_ctx, NULL);if (ret < 0) {fprintf(stderr, "Error occurred when opening output file\n");goto end;}while (1) {AVStream *in_stream, *out_stream;//循环读取每一帧数据ret = av_read_frame(infmt_ctx, &pkt);if (ret < 0) { //读取完后退出循环break;}in_stream = infmt_ctx->streams[pkt.stream_index];//如果当前包的流不是音频、视频、就不用做接下来的处理if (pkt.stream_index >= stream_mapping_size ||stream_mapping[pkt.stream_index] < 0) {av_packet_unref(&pkt);continue;}//按照输出流的index给pkt重新编号pkt.stream_index = stream_mapping[pkt.stream_index];//根据pkt的stream_index获取对应的输出流out_stream = outfmt_ctx->streams[pkt.stream_index];//对pts、dts、duration 进行时间基转换,不同格式时间基都不一样,不转换会导致音视频同步问题pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, 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;log_packet(outfmt_ctx, &pkt, "out");//将处理好的pkt写入输出文件ret = av_interleaved_write_frame(outfmt_ctx, &pkt);if (ret < 0) {fprintf(stderr, "Error muxing packer\n");break;}av_packet_unref(&pkt);}// 写入新的多媒体文件尾av_write_trailer(outfmt_ctx);
end:avformat_close_input(&infmt_ctx);if(outfmt_ctx && !(outfmt->flags & AVFMT_NOFILE)) {avio_closep(&outfmt_ctx->pb);}avformat_free_context(outfmt_ctx);av_freep(&stream_mapping);if (ret < 0 && ret != AVERROR_EOF) {fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));return 1;}return 0;
}

FFmpeg将mp4格式视频转为flv相关推荐

  1. 使用ffmpeg将mp4格式视频元数据信息转到视频第一帧、转换mp4为ts格式视频

    最近在研究web一些播放器,videojs\ckplayer\jwplayer等各种页面播放器,发现在播放视频的时候,有些mp4格式的视频是不能够边缓存边播放的,在网上查阅了一些资料,发现是这些mp4 ...

  2. FFMPEG采集摄像头图像SDL渲染+MP4格式视频编码

    FFMPEG采集摄像头图像SDL渲染+MP4格式视频编码 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音 ...

  3. kindeditor支持视频flv, mp4格式视频上传播放

    首先声明本人用的版本为4.1.12 1.mp4视频格式上传: 修改kindeditor-all.js  _mediaImg()方法 原代码 function _mediaImg(blankPath, ...

  4. m3u8, flv, mp4格式视频demo源码分享

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>m3u ...

  5. 【Opencv基础学习】 VideoWriter打开本地摄像头并保存mp4格式视频

    你好! 这是我第一次用CSDN编写博客.该专栏博客主要来记录学习使用Opencv过程中所遇到的问题及解决方案. 这篇博客主要记录了使用Opencv打开本地摄像头录制视频,并保存为*.mp4文件格式视频 ...

  6. 电脑mp4格式视频打不开怎么解决?

    如今视频在我们的日常生活中随处可见.不少小伙伴越来越喜欢通过视频来分享自己生活中发生的趣事.而使用Mp4视频压缩格式.无疑用于存储音视频文档是一个比较常用的格式,因为这种格式基本可以在任何电子设备上播 ...

  7. 使用Python实现MP4格式视频与图片相互转换

    下面代码可以实现MP4格式视频与图片的相互转换,亲测可用! import cv2 from cv2 import VideoWriter, VideoWriter_fourcc, imread, re ...

  8. 如何在EDUIS中导出ETL字幕模板_教大家Edius如何设置导出mp4格式视频

    近日有关于Edius如何设置导出mp4格式视频的问题受到了很多网友们的关注,大多数网友都想要知道Edius如何设置导出mp4格式视频的具体情况,那么关于到Edius如何设置导出mp4格式视频的相关信息 ...

  9. html5播放mp4不见画面,浏览器播放mp4格式视频时只有声音看不到画面的原因及解决方法(精)...

    做HTML5网页,要播放视频,视频格式为mp4,结果浏览器只能听到声音,看不到画面. 反复测试,多个浏览器均出现此问题.刚开始以为视频的格式不对,我是从MOV转的MP4格式,反复确认嵌入的视频确实是m ...

最新文章

  1. BZOJ 2039: [2009国家集训队]employ人员雇佣
  2. java基础之访问控制符
  3. 学生电脑哪个牌子好_常亮补光灯哪个牌子好服务至上
  4. 按一个按钮会随机死人_《饥荒》那些年坑爹的随机地图,最后一个简直笑死人...
  5. 桌面消息提醒_手机消息总是延迟,真的是网速不行?3招教你找出捣鬼设置
  6. HTTP Content-Disposition Explanation [ from MDN ]
  7. python二维数组读取数报错TypeError: list indices must be integers or slices, not tuple
  8. 说几个打工人要避开的坑
  9. HTML !DOCTYPE 声明详解
  10. java+整合handwrite_解决java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad
  11. java中抽象工厂模式_抽象工厂模式(详解版)
  12. iOS 人脸识别Demo
  13. anaconda 完全卸载——重装
  14. 怎么配置内网IP SSL证书?
  15. GreemPlum6.7.1 Centos7部署文档
  16. v-for on stateful component root element because it renders multiple elements
  17. 自主性: 一个概念的哲学考察
  18. [HDU]1205 吃糖果 [抽屉原理]
  19. 中兴让我们感受到“缺芯”之痛~活在当下!
  20. 质量—弹簧—阻尼系统的建模分析

热门文章

  1. 手机淘宝构架演化实践
  2. 4.2.1朴素模式匹配算法
  3. 虚拟主机能做游戏服务器么,虚拟主机做游戏服务器吗
  4. Python解决图文验证码登录识别(1)
  5. Mega软件操作教程
  6. 苹果CMS海螺模板V16魔改版2.0修复bug分享给大家
  7. excel设置行高和列宽
  8. 蓝牙BLE方案|伦茨科技-智能直播补光灯方案
  9. 程序员面试必备软技能,值得收藏!
  10. [创业之路-50] :动态股权机制 -5- 创业公司股权分配常见的坑