官方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

2151

被折叠的 条评论
为什么被折叠?



