mp4转成flv格式文件步骤如下:
1.打开输入文件,创建输入文件和输出文件的上下文环境
2.遍历输入文件的每一路流,每个输入流对应创建一个输出流,将输入流中的编解码参数直接拷贝到输出流中。
3.文件的写入。
先写入新的多媒体文件的头。
然后遍历输入文件的每一帧,对每一帧进行时间基的转换,转换好后写入新的多媒体文件。
最后再多媒体文件中写入文件尾。

bool fftest::transfmp42flv( const char* dst)
{AVOutputFormat* _ofmt = nullptr; //输出格式,每种封装格式对应一个该结构体AVInputFormat* _ifmt = nullptr;  //输入格式//封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息AVFormatContext* _ifmt_ctx = nullptr, * _ofmt_ctx = nullptr; // 输入、输出是上下文环境AVPacket pkt;int ret;int stream_index = 0;int* stream_mapping = nullptr;//数组用于存储输出文件流的indexint stream_mapping_size = 0;//输入文件中流的总数量//打开输入文件,为ifmt_ctx分配内存if ((ret = avformat_open_input(&_ifmt_ctx, _src, nullptr, nullptr)) < 0) {std::cout << "Could not open input file " << _src << std::endl;avformat_close_input(&_ifmt_ctx);return false;}//检索输入文件流信息if ((ret = avformat_find_stream_info(_ifmt_ctx, 0)) < 0) {std::cout << "Failed to retrieve input stream information" << std::endl;avformat_close_input(&_ifmt_ctx);return false;}//打印输入文件相关信息av_dump_format(_ifmt_ctx, 0, _src, 0);//为输出上下文环境分配内存if ((ret = avformat_alloc_output_context2(&_ofmt_ctx, NULL, NULL, dst)) < 0) {std::cout << "Could not create output context\n";avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);return false;}//输入文件流的数量stream_mapping_size = _ifmt_ctx->nb_streams;//分配stream_mapping_size段内存,每段内存大小是sizeof(*stream_mapping)stream_mapping = (int*)av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping));if (!stream_mapping) {std::cout << "Could not malloc stream mapping array\n";ret = AVERROR(ENOMEM);avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);av_freep(&stream_mapping);return false;}//输出文件格式_ofmt = _ofmt_ctx->oformat;//遍历输入文件中的每一路流,对于每一路流都要创建一个新的流进行输出for (uint32_t i = 0; i < _ifmt_ctx->nb_streams; i++) {AVStream* out_stream; //输出流AVStream* in_stream = _ifmt_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(_ofmt_ctx, nullptr);if (!out_stream) {std::cout << "Failed allocating output stream\n";ret = AVERROR_UNKNOWN;avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);av_freep(&stream_mapping);return false;}//直接将输入流的编解码参数拷贝到输出流中if (avcodec_parameters_copy(out_stream->codecpar, in_codecpar) < 0){std::cout << "Failed to copy codec parameters\n";ret = AVERROR_UNKNOWN;avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);av_freep(&stream_mapping);return false;}out_stream->codecpar->codec_tag = 0;}//打印要输出的多媒体文件的详细信息av_dump_format(_ofmt_ctx, 0, dst, 1);if (!(_ofmt->flags & AVFMT_NOFILE)) {if (avio_open(&_ofmt_ctx->pb, dst, AVIO_FLAG_WRITE) < 0) {std::cout << "Could not open output file " << dst << std::endl;ret = AVERROR_UNKNOWN;avio_closep(&_ofmt_ctx->pb);avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);av_freep(&stream_mapping);return false;}}//写入新的多媒体文件的头if (avformat_write_header(_ofmt_ctx, nullptr) < 0) {std::cout << "Error occurred when opening output file\n";ret = AVERROR_UNKNOWN;avio_closep(&_ofmt_ctx->pb);avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);av_freep(&stream_mapping);return false;}while (true){AVStream* in_stream, * out_stream;//循环读取每一帧数据if (av_read_frame(_ifmt_ctx, &pkt) < 0) //读取完后退出循环break;in_stream = _ifmt_ctx->streams[pkt.stream_index];if (pkt.stream_index >= stream_mapping_size ||stream_mapping[pkt.stream_index] < 0) {av_packet_unref(&pkt);continue;}pkt.stream_index = stream_mapping[pkt.stream_index]; // 按照输出流的index给pkt重新编号out_stream = _ofmt_ctx->streams[pkt.stream_index]; // 根据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;// 将处理好的pkt写入输出文件ret = av_interleaved_write_frame(_ofmt_ctx, &pkt);if (ret < 0) {fprintf(stderr, "Error muxing packet\n");break;}av_packet_unref(&pkt);}// 写入新的多媒体文件尾av_write_trailer(_ofmt_ctx);if (_ofmt_ctx && !(_ofmt->flags & AVFMT_NOFILE))avio_closep(&_ofmt_ctx->pb);av_freep(&stream_mapping);avformat_free_context(_ofmt_ctx);avformat_close_input(&_ifmt_ctx);return true;
}

FFmpeg将mp4转成flv相关推荐

  1. ffplay flv mp4 转_利用 FFmpeg 将 MP4 转成 FLV

    最近做一个小项目,要在线播放录制的 MP4 视频,想开源的 flash player 或 html 5 可以播放.可,虽然 MP4 是 H.264 编码,但就是播放不了.可能是封装方式(PS 方式)不 ...

  2. ffplay flv mp4 转_FFmpeg将mp4转成flv

    mp4转成flv格式文件步骤如下: 1.打开输入文件,创建输入文件和输出文件的上下文环境 2.遍历输入文件的每一路流,每个输入流对应创建一个输出流,将输入流中的编解码参数直接拷贝到输出流中. 3.文件 ...

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

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

  4. Ubuntu16.04下ffmpeg把MP4转换成图片的方法

    视频和输出文件夹应放置再同一个文件夹下放置位置如图: 运行命令: ffmpeg -i 1.mp4 -f image2 ./jpg/%05d.jpg 最后会在 jpg文件夹下找到输出的图片.

  5. 使用FFMpeg将MP4转为m3u8

    使用ffmpeg将mp4切成ts片段的时候会碰到一个问题,就是生成的m3u8文件里只有最后的五个片段的信息. 这是因为ffmpeg 默认的list size 为5,所以只获得最后的5个片段.为了解决这 ...

  6. ffmpeg 转换flv压缩大小_ffmpeg 转换 mp4 成 flv

    ① mp4 转 flv 参考资料: https://addpipe.com/blog/flv-to-mp4/ ffmpeg -i demo.mp4 -c:v libx264 -crf 19 demo. ...

  7. mysql+视频文件转成流_详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:W ...

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

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

  9. 使用ffmpeg进行视频文件转换成FLV整理

    本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...

最新文章

  1. github下载慢,轻松提速教程
  2. LeetCode-动态规划-198. 打家劫舍
  3. 边工作边刷题:70天一遍leetcode: day 6
  4. java中一级缓存二级缓存_[Java] hibernate 一级缓存和二级缓存
  5. tensorflow 安装_安装tensorflow-gpu 2.0
  6. [转] 春晚诗朗诵《心里话》之程序员版!!
  7. datagridview表中插入一行_excel表格技巧:Ctrl+T在超级表中的妙用
  8. 什么是垃圾回收(转)
  9. Neo4j清空数据库
  10. 陈景润定理对筛法理论的贡献
  11. 正片工艺、负片工艺,这两种PCB生产工艺的差异到底是什么?
  12. [日推荐]『与你见字如面』信息时代的一股清流
  13. 计算机磁盘密码解锁,Bitlocker加密磁盘但是没有密码加密,我的电脑是专业版
  14. CGAN原理及tensorflow代码
  15. 使用jQuery,写一个简单的轮播图,实现切换功能!
  16. SAP S4 Material Management 库存模块 MARD 数据库表读取技术细节介绍
  17. 大数据技术之_11_HBase学习_03_HBase 实战之谷粒微博(练习API) + 扩展知识(布隆过滤器+HBase2.0 新特性)
  18. 成都Java开发前景怎么样?好找工作吗?
  19. 2021年CS保研经历(五):北航计算机学院、武汉大学数学与统计学院、华科计算机科学与技术学院
  20. 用Python快速分析和预测股票价格 !

热门文章

  1. 100例(p019—p021)
  2. An overview of color constancy algorithms论文笔记
  3. ZJOI round1游记
  4. 北京小升初计算机编程特长生班,北京特长生小升初测试启动 家长凌晨排队取号 图...
  5. 服务器装win10 稳定吗,其实不必太过纠结 谈谈Mac装不装Win10
  6. VSPD虚拟串口软件的一些使用说明
  7. Elliptic Curve Cryptography: finite fields and discrete logarithms
  8. Spring Boot--Druid连接池的配置方法
  9. Windows10系统时间同步没有效果的解决方法
  10. Ant Design Vue 的 table 隐藏特定列