1.ffmpeg简介
FFmpeg即是一块音视频编解码工具,同时也是一组音视频编解码开发套件,为开发者提供了丰富的音视频
处理调用接口。FFmpeg中的"FF"指的是"Fast Forward",mpeg则是动态图像专家组。 它提供了录制、转换
以及流化音视频的完整解决方案。 它包含了非常先进的音频/视频编解码库 libavcodec, 为了保证高可移植
性和编解码质量, libavcodec 里很多 codec 都是从头开发的
2.实现原理
实现原理:在程序中通过cmd控制台调用ffmpeg.exe工具,并给该工具发送对应的命令,完成所需操作,发
命令时,cmd窗口隐藏在后台。
本项目有两种生成gif动态图方式:
1)使用图片生成
2) 使用短视频生成
3.项目实现
1)界面
本项目界面部分主要是依靠duilib界面库,通过 Duilib UI Designr 和 xml 修改设计。
2.使用cmd给ffmpeg发送命令
采用SHELLEXECUTEINFO结构体
//1.初始换结构体
SHELLEXECUTEINFO strSEInfo;
memset(&strSEInfo, 0, sizeof(SHELLEXECUTEINFO));
strSEInfo.cbSize = sizeof(SHELLEXECUTEINFO);
strSEInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
strSEInfo.lpFile = _T("C:\\Windows\\System32\\cmd.exe");
strSEInfo.lpParameters = strCMD;
strSEInfo.nShow = SW_SHOW;//SW_HIDE
//2.给cmd发送命令
ShellExecuteEx(&strSEInfo);
WaitForSingleObject(strSEInfo.hProcess, INFINITE);
3.按钮事件响应
1) 加载按钮
主要依靠OPENFILENAME结构体以及GetOpenFileName函数,具体操作如下:
- 定义OPENFILENAME结构体变量ofn,并对其进行初始化
- 将ofn的地址作为参数调用GetOpenFileName函数,弹出打开文件对话框
- 在弹出的对话框中找到文件位置
- 从ofn的lpstrFile参数中提取文件位置
- 对获取的路径进行检测后,将其显式在编辑框中。
OPENFILENAME ofn;
TCHAR FileName[MAX_PATH];
memset(&ofn, 0, sizeof(OPENFILENAME));
memset(FileName, 0, sizeof(char)*MAX_PATH);
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFilter = _T("视频\0*.mp4;*.rmvb;*.flv;*.avi;*.wmv;\0");
ofn.lpstrFile = FileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))//FileName得到用户所选择文件的路径
{
CEditUI* pPathEdit = (CEditUI*)m_PaintManager.FindControl(_T("EDIT_PATH"));
pPathEdit->SetText(FileName);
}
2)生成gif
a. 使用图片生成gif
ffmpeg -r 1 -i .\\Pictrue\\%d.jpg picoutput.gif
b. 使用视频生成gif
ffmpeg -r 50 -i output.avi viewoutput.gif
3)截取按钮
给ffmpeg发送截取视频命令,截取出所需视频:
ffmpeg -ss 00:00:15 -to 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
4) 烧录ASS按钮
将修改后的ASS文件烧录到对应的视频中。
ffmpeg -i 1.avi -vf ass=2.ass 3.avi
5)字幕提取
因为ffmpeg的字幕提取命令出错无法解决,因此借助外部软件提取视频字幕,本项目使用的是 esrXP 软件。