工具/原料:戴尔xps15、windows10专业版、剪映电脑专业版V3.0.0
1、打开剪映软件,点击“开始创作”按钮新建一个项目。
2、点击“导入”按钮,把视频文件导入软件。
3、点击视频素材上的【+】按钮,把素材加入轨道。
4、点击进入“文本”界面,再点击“本地字幕”按钮。
5、点击“导入”按钮,选择准备好的字幕文件。
6、导入完成后,点击字幕上的【+】按钮,就可以把字幕加到视频轨道上了。
在视频功能里,一般对视频加文字是使用AVMutableVideoComposition加载一层文字图层,但是想要对一个视频嵌入一个srt文件中的所有字幕呢?难点是一个srt文件中,每一段文字都有一个时间节点,需要解析时间节点把文字嵌入到视频中。
第一种方式:
AVAssetReader+AVAssetWriter
这两个对象都是AVFoundation中的,通过它们可以对视频解码生成CMSampleBufferRef对象,这个对象包含了视频,音频中每一片流中的信息,并且可以转换成UIImage单独对流 *** 作,可以对视频、音频文件重新编码:码率、帧率、分辨率、比特率、声道等。
AVAssetReader读取视频中的appendPixelBuffer,把它转换为UIImage,根据时间节点把字幕嵌入到UIImage中,这样一张图片就有了文字,然后再转换回CVPixelBufferRef,再用AVAssetWriterInputPixelBufferAdaptor的appendPixelBuffer方法写入一个新的视频流文件中,最终生成一个带有字幕的视频。
缺点:耗时久,cpu加载过高,把控好内存泄漏。
还有一个坑点,因为视频中可能会有旋转角度,比方说我使用8P拍的竖屏视频,再使用AVAssetReader解码的时候,解出来的CMSampleBufferRef都会旋转90度,所以需要对AVAssetWriterInput对象中的transform赋值,但是这种方式是在输出的时候对流旋转,在现在的字幕的方案的流程是
CMSampleBufferRef转换UIImage、
UIImage写文字、
UIImage转换CVPixelBufferRef。
所以需要改为:
CMSampleBufferRef转换UIImage,UIImage旋转90度
UIImage写文字,UIImage旋转回去、
UIImage转换CVPixelBufferRef。
效果图
AVAssetReader读取类:
AVAssetWriter写入类:
使用它们嵌入字幕
附带srt文件解析
GitHub链接:
https://github.com/qw9685/srt-.git
另一种方式嵌入字幕,提高性能: https://www.jianshu.com/p/e372a7b98b29
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)