其实具体的代码ffmpeg的官方demo做的功能已经很完善了,自己也就修修补补,下面直接上代码

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <tchar.h>//这里是个坑,不加extern "C",死活编译不过
extern "C"
{#include "libavformat/avformat.h"
};using namespace std;int _tmain(int argc, _TCHAR* argv[])
{AVOutputFormat *ofmt = NULL;//创建输入AVFormatContext对象和输出AVFormatContext对象AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;AVPacket pkt;const char *in_filename;int ret, i;int stream_index = 0;int *stream_mapping = NULL;int stream_mapping_size = 0;in_filename  = “C:\\test.h264”;//产生对应的录像文件名SYSTEMTIME systime;GetLocalTime(&systime);char cTime[128];sprintf(cTime,"%4d/%02d/%02d %02d:%02d:%02d.%03d\n",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute, systime.wSecond,systime.wMilliseconds);char out_filename[128];sprintf_s(out_filename,128,"%s.mp4",cTime);//打开视频文件if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {//LogMessage::DebugLogInfo("ReCode", "打开视频流失败");return -1;}//获取视频文件信息if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {//LogMessage::DebugLogInfo("ReCode", "获取视频流信息失败");return -1;}//打印信息//av_dump_format(ifmt_ctx, 0, in_filename, 0);//输出文件分配空间avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);if (!ofmt_ctx) {//LogMessage::DebugLogInfo("ReCode", "输出文件分配空间分配失败");return -1;}stream_mapping_size = ifmt_ctx->nb_streams;stream_mapping = (int *)av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping));if (!stream_mapping) {//LogMessage::DebugLogInfo("ReCode", "获取mapping失败");return -1;}ofmt = ofmt_ctx->oformat;for (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;}stream_mapping[i] = stream_index++;out_stream = avformat_new_stream(ofmt_ctx, NULL);if (!out_stream) {//fprintf(stderr, "Failed allocating output stream\n");//LogMessage::DebugLogInfo("ReCode", "分配流对象失败");return -1;}ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);if (ret < 0) {//LogMessage::DebugLogInfo("ReCode", "拷贝视频code失败");return -1;}out_stream->codecpar->codec_tag = 0;}//打开文件if (!(ofmt->flags & AVFMT_NOFILE)) {ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);if (ret < 0) {//LogMessage::DebugLogInfo("ReCode", "打开输出文件失败");return -1;}}//开始写入文件头ret = avformat_write_header(ofmt_ctx, NULL);if (ret < 0) {//LogMessage::DebugLogInfo("ReCode", "写入文件头失败");return -1;}int m_frame_index = 0;//开始读取视频流,并获取pkt信息while (1) {AVStream *in_stream, *out_stream;ret = av_read_frame(ifmt_ctx, &pkt);if (ret < 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];out_stream = ofmt_ctx->streams[pkt.stream_index];//从摄像头直接保存的h264文件,重新编码时得自己加时间戳,不然转换出来的是没有时间的if(pkt.pts==AV_NOPTS_VALUE){//Write PTSAVRational time_base1=in_stream->time_base;//Duration between 2 frames (us)int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);//Parameterspkt.pts=(double)(m_frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);pkt.dts=pkt.pts;pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);}/* copy packet */pkt.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;ret = av_interleaved_write_frame(ofmt_ctx, &pkt);if (ret < 0) {break;}av_packet_unref(&pkt);m_frame_index++;}av_write_trailer(ofmt_ctx);avformat_close_input(&ifmt_ctx);// close output if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))avio_closep(&ofmt_ctx->pb);avformat_free_context(ofmt_ctx);av_freep(&stream_mapping);return 0;
}

使用ffmpeg将h264视频文件转Mp4格式保存相关推荐

  1. 教你压缩视频文件为MP4格式

    在电脑上下载视频到MP4上不知道大家有没有发现下载的视频不能播放,挥着是下载到U盘中,使用U盘在小轿车上播放视频,下载的很多视频或是音频都是不能正常的播放的,车上的播放器会显示为格式错误,那么怎样将下 ...

  2. mp4v2再学习 -- H264视频编码成MP4文件

    一.H264视频编码成MP4文件 参看:H264视频编码成MP4文件 参看:mp4v2在VS2010下的编译与在项目中的使用 最近做项目需要将H264文件封装为mp4文件,从网上找到了MP4V2库,下 ...

  3. H264视频编码成MP4文件

    http://blog.csdn.net/firehood_/article/details/8813587 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近需要将H264视频编码成MP4格 ...

  4. m4v视频怎么转换mp4格式,4种方式教给你

    m4v视频怎么转换mp4格式?当你从网络上下载视频文件的时候,有时可能会遇到兼容性较差的m4v格式,因为m4v自身兼容性不高的原因,大家在使用m4v格式的视频文件时,经常会受到播放器的规格限制,这样就 ...

  5. FFmpeg 4.0.2编码YUV序列为H264视频文件

    /****************************** 功能:编码YUV序列为h264视频文件 FFmpeg:4.0.2 ******************************/ #in ...

  6. ffmpeg —— v4l2录制h264视频文件(边采集边转码)

    相关文章: v4l2采集图像并转换格式 视频编码(yuv编码h264) 目标:使用v4l2采集摄像头图像数据,并实时编码成h264视频文件. 代码: #include <stdio.h> ...

  7. FFmpeg[4] - 将视频文件转码成FLV格式(FFmpeg转封装1)

    目录 前言 正文 总结 <FFmpeg实用技巧>系列-总览 前言 今天我们来看看FFmpeg如何将一个视频文件转码成FLV格式. 正文 FLV封装格式支持常见的视频H264(AVC).H2 ...

  8. H264 视频文件 帧格式 传输封装等 杂碎

    H264 视频文件 帧格式 传输封装等 杂碎 rfc3984 Standards Track [Page 2] RFC 3984 RTP Payload Format for H.264 Video ...

  9. 使用 FFmpeg(bilibili视频blv合成mp4)

    (关于FFmpeg的安装请看上文使用 使用 FFmpeg(bilibili视频m4s合成mp4)) 我们先来看看 B 站客户端下载内容的目录结构: 10034455(视频 AV 号) ├── 1(视频 ...

  10. ffmpeg 在线音频上传合成mp4格式视频,可以在网络中直接播放。

    Java环境: 注意:以下转码兼容所有Android,iOS.网络上找的关于ffmpeg转mp4,只能兼容部分Android,iOS根本播放不了. 我这里有三个ffmpeg.exe文件版本.网络找下下 ...

最新文章

  1. 类型实现《程序员的第一年》--------------C#中System.Collections.Generic.SortedDictionary 的使用...
  2. 基于MATLAB的RSSI 和 PLE 定位算法,并通过卡尔曼滤波器减少非视距误差
  3. 业内首款云原生技术中台产品云原生 Stack 来了!
  4. aircv 安装_Python 通过截图匹配原图中的位置(opencv)实例
  5. 利用cors,实现js跨域访问Tomcat下资源
  6. LeetCode443-压缩字符串(双索引)
  7. Xcode7 无账号真机测试!!
  8. java 阶乘算法_Java 实现阶乘算法
  9. 录音文件下载_轻便简洁的电脑录音软件,Moo0录音专家中文免费版,大小不过3M...
  10. java 电子签章_PDF开发+电子签章,如何实现真正地脱离硬件的无纸化办公体验(实战篇)?...
  11. 关于ps cs6的滤镜 (抽出)
  12. 深度森林论文阅读笔记
  13. python 操作excel排序_python操作excel[转]
  14. 2021-02-26
  15. 把多个EXCEL文件汇总到一个EXCEL中
  16. android 键盘快捷指令
  17. PS作业-Camera Raw滤镜练习
  18. 基于极限学习机的预测、图像降噪和回归
  19. LockSupport 以及 park、unpark 方法
  20. 【smoj 1167】松果

热门文章

  1. ipv6的127位掩码如何表示_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...
  2. 本机Windows远程操作虚拟机Windows界面
  3. AEP(PMM) 傲腾内存特性
  4. elasticsearch修改配置文件后启动报错:Caused by: expected 'document start‘', but found BlockMappingStart
  5. 3Dmax软件安装问题解决方法
  6. ABC类网络个数的算法
  7. Maven中央仓库地址和Nexus 下载地址
  8. 狂神说Linux学习笔记
  9. 海康视频监控解决方案
  10. Oracle使用Shell脚本导出Excel表格