FFMpeg.AutoGen(2)讲解官方example代码:编码

官方Example代码里编码的作业:把上一讲解码出来的jpg图片,编码成264格式的文件。

编码的流程,也是本文目录

1.把图片转换byte[]

2.把图片转换成yuv格式,封装成avframe。

3.编码。

先贴出编码的主函数。函数里分析下来,就是通过调用相关类和函数实现的目录三步。

  1         /// <summary>
  2         /// 编码 把解码出来的jpg文件,再编码成UV420P
  3         /// </summary>
  4         private static unsafe void EncodeImagesToH264()
  5         {
  6 
  7             //获取解码出来的文件队列
  8             var frameFiles = Directory.GetFiles(".", "frame.*.jpg").OrderBy(x => x).ToArray();
  9             //获取第一张帧图片
 10             var fistFrameImage = Image.FromFile(frameFiles.First());
 11 
 12             //设置导出媒体信息
 13             var outputFileName = "out.h264";
 14             var fps = 25;
 15             var sourceSize = fistFrameImage.Size;
 16             var sourcePixelFormat = AVPixelFormat.AV_PIX_FMT_BGR24;
 17             var destinationSize = sourceSize;
 18             var destinationPixelFormat = AVPixelFormat.AV_PIX_FMT_YUV420P;
 19             //创建格式转换其 把rgb 转变成yuv ,同时对分辨率进行缩放
 20             using (var vfc = new VideoFrameConverter(sourceSize, sourcePixelFormat, destinationSize, destinationPixelFormat))
 21             {
 22                 // be advise only ffmpeg based player (like ffplay or vlc) can play this file, for the others you need to go through muxing
 23                 //建议基于ffmpeg的播放器播放这个文件out.h264,否则需要多路复用技术
 24                 //这个文件就是用ffmpeg把rgb图片转变成264的一个个帧。
 25                 using (var fs = File.Open(outputFileName, FileMode.Create))
 26 
 27                 {
 28                     //创建264转换 把要保存的文件句柄fs 帧率fps 源大小destinationSize 传入
 29                     using (var vse = new H264VideoStreamEncoder(fs, fps, destinationSize))
 30                     {
 31                         var frameNumber = 0;
 32                         //读取每一张图片,作为一帧
 33                         foreach (var frameFile in frameFiles)
 34                         {
 35                             byte[] bitmapData;
 36 
 37                             using (var frameImage = Image.FromFile(frameFile))
 38                             using (var frameBitmap = frameImage is Bitmap bitmap ? bitmap : new Bitmap(frameImage))// is 后面接变量申明 这个写法比较有意思
 39                             {
 40                                 bitma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值