/***先将H.264文件读入内存,*再输出封装格式文件。*/
#include "stdafx.h"#define __STDC_CONSTANT_MACROSextern "C"
{
#include "libavformat/avformat.h"
}#define IO_BUFFER_SIZE 32768FILE *fp_open;/***在avformat_open_input()中会首次调用该回调函数,*第二次一直到最后一次都是在avformat_find_stream_info()中循环调用,*文件中的数据每次IO_BUFFER_SIZE字节读入到内存中,*经过ffmpeg处理,所有数据被有序地逐帧存储到AVPacketList中。*以上是缓存设为32KB的情况,缓存大小设置不同,调用机制也有所不同。*/
int fill_iobuffer(void *opaque, uint8_t *buf, int buf_size)
{if (!feof(fp_open)){int true_size = fread(buf, 1, buf_size, fp_open);return true_size;}else{return -1;}}int convert(const char *in_filename_v, const char *out_filename)
{AVInputFormat *ifmt_v = NULL;AVOutputFormat *ofmt = NULL;AVFormatContext *ifmt_ctx_v = NULL, *ofmt_ctx = NULL;AVPacket pkt;int ret, i;int videoindex_v = -1, videoindex_out = -1;int frame_index = 0;int64_t cur_pts_v = 0;av_register_all();fp_open = fopen(in_filename_v, "rb+");ifmt_ctx_v = avformat_alloc_context();unsigned char *iobuffer = (unsigned char *)av_malloc(IO_BUFFER_SIZE);AVIOContext *avio = avio_alloc_context(iobuffer, IO_BUFFER_SIZE, 0, NULL, fill_iobuffer, NULL, NULL);ifmt_ctx_v->pb = avio;ifmt_v = av_find_input_format("h264");if ((ret = avformat_open_input(&ifmt_ctx_v, "nothing", ifmt_v, NULL)) < 0) {printf("Could not open input file.");goto end;}if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0)) < 0) {printf("Failed to retrieve input stream information");goto end;}printf("===========Input Information==========\n");av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);printf("======================================\n");avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);if (!ofmt_ctx) {printf("Could not create output context\n");ret = AVERROR_UNKNOWN;goto end;}ofmt = ofmt_ctx->oformat;AVStream *in_stream = ifmt_ctx_v->streams[0];AVStream *out_stream = avformat_new_stream(ofmt_ctx, NULL);videoindex_v = 0;if (!out_stream) {printf("Failed allocating output stream\n");ret = AVERROR_UNKNOWN;goto end;}videoindex_out = out_stream->index;//Copy the settings of AVCodecContextif (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {printf("Failed to copy context from input to output stream codec context\n");goto end;}out_stream->codec->codec_tag = 0;/* Some formats want stream headers to be separate. */if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;printf("==========Output Information==========\n");av_dump_format(ofmt_ctx, 0, out_filename, 1);printf("======================================\n");//Open output fileif (!(ofmt->flags & AVFMT_NOFILE)) {if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) < 0) {printf("Could not open output file '%s'", out_filename);goto end;}}//Write file headerif (avformat_write_header(ofmt_ctx, NULL) < 0) {printf("Error occurred when opening output file\n");goto end;}while (1) {AVFormatContext *ifmt_ctx;int stream_index = 0;AVStream *in_stream, *out_stream;//Get an AVPacketifmt_ctx = ifmt_ctx_v;stream_index = videoindex_out;if (av_read_frame(ifmt_ctx, &pkt) >= 0){do{in_stream = ifmt_ctx->streams[pkt.stream_index];out_stream = ofmt_ctx->streams[stream_index];if (pkt.stream_index == videoindex_v){//FIX:No PTS (Example: Raw H.264)//Simple Write PTSif (pkt.pts == AV_NOPTS_VALUE){//Write PTSAVRational time_base1 = in_stream->time_base;//Duration between 2 frames (μs)int64_t calc_duration = (double)AV_TIME_BASE / av_q2d(in_stream->r_frame_rate);//Parameterspkt.pts = (double)(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);frame_index++;}cur_pts_v = pkt.pts;break;}} while (av_read_frame(ifmt_ctx, &pkt) >= 0);}else{break;}//Convert 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;pkt.stream_index = stream_index;printf("Write 1 Packet. size:%5d\tpts:%lld\n", pkt.size, pkt.pts);//Writeif (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {printf("Error muxing packet\n");break;}av_free_packet(&pkt);}//Write file trailerav_write_trailer(ofmt_ctx);end:avformat_close_input(&ifmt_ctx_v);/* close output */if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))avio_close(ofmt_ctx->pb);avformat_free_context(ofmt_ctx);fclose(fp_open);if (ret < 0 && ret != AVERROR_EOF) {printf("Error occurred.\n");return -1;}return 0;
}int main(int argc, char* argv[])
{//const char *in_filename_v = argv[1]; //Input file URL//const char *out_filename = argv[2]; //Output file URLconst char *in_filename_v = "media files/JINUSEAN_17s.h264"; //Input file URLconst char *out_filename = "media files/JINUSEAN_17s.mkv"; //Output file URLconvert(in_filename_v, out_filename);return 0;
}

利用FFmpeg将H.264文件读入内存,再输出封装格式文件相关推荐

  1. 模拟输入H.264流,输出封装格式文件(API版)

    每次从H.264文件读入一定数据量的数据,模拟输入H.264流,最终输出封装格式文件. //H264ToContainer_Win32.h extern "C" {//@param ...

  2. 模拟输入H.264流,输出封装格式文件

    /***每次从H.264文件读取IO_BUFFER_SIZE字节的数据,*模拟输入H.264流,最终输出封装格式文件.*/ #include "stdafx.h"#define _ ...

  3. ffmpeg解码H.264视频数据,MFC播放视频

    ffmpeg 是一个完整的视频流解决方案,开源且有良好的跨平台性,ffmpeg具有强大的多媒体数据处理能力,能够实现视频的采集,多种视频格式间转换,给视频添加水印等多种功能,已被 VLC.Mplaye ...

  4. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg的H.264解码器源代码简单分析:概述

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)...

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  8. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)...

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  9. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

最新文章

  1. 用netstat查看网络状态详解
  2. [转]网络爬虫(一):抓取网页的含义和URL基本构成
  3. 解决Latex编译报错:Command `\Bbbk‘ already defined. ...ol{\Bbbk} {\mathord}{AMSb}{“7C}
  4. LSOF 安装与使用
  5. 网上花店java项目_jsp+servlet开发java web网上花店商城系统,后台可配置化,方便修改,也可修改做成其他商城类项目...
  6. C#可空类型(Nullable)
  7. CentOS配置国内(阿里云)镜像加速器
  8. Xiaojie雷达之路---TI实战笔记---OSAL layer说明
  9. 方正计算机如何用u盘安装系统,方正电脑用u盘装系统操作方法
  10. ECCV2022 | 大工(卢湖川团队)提出用于图像-文本匹配的深度跨模态投影学习
  11. linux虚拟串口控制器驱动开发及代码实现(uart driver)
  12. EXcel用法——如何冻结前两行,如何删除筛选的行
  13. 解决双击事件触发两次单击事件
  14. MODBUS通讯协议学习总结
  15. AB实验平台在贝壳找房的设计与实践
  16. 企业技术中台架构全景图(多图)
  17. Linux Centos7 搭建简易堡垒机安装jailkit实现chroot
  18. android opengl 百度地图,androidsdk | 百度地图API SDK
  19. 《善数者成:大数据改变中国》读书笔记2
  20. 太阳高度角计算题_太阳高度角的计算与应用答题.ppt

热门文章

  1. 一颗椰子糖机器人_“媒体训练营”走进海南春光 聆听椰子糖诞生故事
  2. (转)分辨率 PPI DPI概念定义详解
  3. python预测糖尿病_Python数据挖掘 | 实战案例之预测糖尿病
  4. 东芝三星正式停产光驱:市场只剩两家
  5. 晶振、时钟周期、机器周期
  6. 音视频SDK封装截图
  7. Vue使用Stompjs接收Activemq的信息
  8. python要学多久才可以,python一般需要学多久
  9. 拉格朗日对偶函数拉格朗日对偶问题
  10. 主成分分析法PCA(一):算法原理