|
|
deepseek可以写,这是我让它帮我写的匿名管道,图片+音乐合成视频带进度条的
|
| 执行FFmpeg | 逻辑型 | | |
| 命令行文本 | 文本型 | | | | 最终输出 | 文本型 | | | | 退出码 | 整数型 | | | | 图片目录 | 文本型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 安全属性 | SECURITY_ATTRIBUTES | | | | 启动信息 | STARTUPINFO | | | | 进程信息 | PROCESS_INFORMATION | | | | hRead | 整数型 | | | | hWrite | 整数型 | | | | 缓冲区 | 字节集 | | | | 已读字节 | 整数型 | | | | 可用字节 | 整数型 | | | | 当前文本 | 文本型 | | | | 完整输出 | 文本型 | | | | 循环计数 | 整数型 | | | | 行缓冲 | 字节集 | | | | 换行位置 | 整数型 | | | | 完整行 | 字节集 | | | | 剩余缓冲 | 字节集 | | | | 错误码 | 整数型 | | | | 退出码临时 | 整数型 | | | 置转化进度 (“=== 开始执行FFmpeg ===”)置转化进度 (“命令行: ” + 命令行文本 )安全属性.nLength = 12 安全属性.lpSecurityDescriptor = 0 安全属性.bInheritHandle = 真 如果真 (CreatePipe (hRead, hWrite, 安全属性, 0 ) = 假) 置转化进度 (“创建管道失败!”) 返回 (假)置转化进度 (“管道创建成功”)启动信息.cb = 68 启动信息.dwFlags = 位或 ( #STARTF_USESHOWWINDOW, #STARTF_USESTDHANDLES )启动信息.wShowWindow = #SW_HIDE 启动信息.hStdOutput = hWrite 启动信息.hStdError = hWrite 如果真 (CreateProcess (0, 取运行目录 () + “\ffmpeg.exe ” + 命令行文本, 0, 0, 真, 0, 0, 0, 启动信息, 进程信息 ) = 假) 置转化进度 (“创建进程失败,错误码=” + 到文本 (GetLastError ()) ) CloseHandle (hRead ) CloseHandle (hWrite ) 返回 (假)置转化进度 (“进程创建成功”)CloseHandle (hWrite )置转化进度 (“父进程写句柄已关闭”)行缓冲 = { }循环计数 = 0 完整输出 = “”退出码 = 0 判断循环首 (真) 循环计数 = 循环计数 + 1  如果 (循环计数 % 10 = 0 ) 置转化进度 (“循环次数: ” + 到文本 (循环计数 ))       PeekNamedPipe (hRead, 0, 0, 0, 可用字节, 0 ) 如果 (可用字节 > 0 ) 置转化进度 (“管道有数据,大小=” + 到文本 (可用字节 ))   缓冲区 = 取空白字节集 (可用字节 )  如果 (ReadFile_ (hRead, 缓冲区, 可用字节, 已读字节, 0 ) = 真)    置转化进度 (“ReadFile_ 成功,读取了 ” + 到文本 (已读字节 ) + “ 字节”)   如果 (已读字节 > 0 )    行缓冲 = 行缓冲 + 取字节集左边 (缓冲区, 已读字节 )    判断循环首 (真)     换行位置 = 寻找字节集 (行缓冲, { 10 }, )     如果 (换行位置 = -1 )     跳出循环 ()      完整行 = 取字节集左边 (行缓冲, 换行位置 - 1 )      剩余缓冲 = 取字节集右边 (行缓冲, 取字节集长度 (行缓冲 ) - 换行位置 - 1 )      当前文本 = 取字节集数据 (完整行, #文本型, )       完整输出 = 完整输出 + 当前文本 + #换行符       行缓冲 = 剩余缓冲           判断循环尾 ()   置转化进度 (“ReadFile 读取了0字节”)  调试输出 (当前文本)        错误码 = GetLastError ()  置转化进度 (“ReadFile_ 失败,错误码=” + 到文本 (错误码 ))    如果 (错误码 = 109 )       置转化进度 (“管道已关闭,等待进程结束...”)   WaitForSingleObject (进程信息.进程句柄, #INFINITE )   GetExitCodeProcess (进程信息.进程句柄, 退出码 )   置转化进度 (“进程退出码=” + 到文本 (退出码 ))       PeekNamedPipe (hRead, 0, 0, 0, 可用字节, 0 )    如果 (可用字节 > 0 )    置转化进度 (“发现残留数据,大小=” + 到文本 (可用字节 ))      缓冲区 = 取空白字节集 (可用字节 )     如果 (ReadFile_ (hRead, 缓冲区, 可用字节, 已读字节, 0 ) = 真)     置转化进度 (“残留数据读取成功,大小=” + 到文本 (已读字节 ))       如果 (已读字节 > 0 )       行缓冲 = 行缓冲 + 取字节集左边 (缓冲区, 已读字节 )             判断循环首 (真)        换行位置 = 寻找字节集 (行缓冲, { 10 }, )        如果 (换行位置 = -1 )        跳出循环 ()         完整行 = 取字节集左边 (行缓冲, 换行位置 - 1 )         剩余缓冲 = 取字节集右边 (行缓冲, 取字节集长度 (行缓冲 ) - 换行位置 - 1 )         当前文本 = 取字节集数据 (完整行, #文本型, )         完整输出 = 完整输出 + 当前文本 + #换行符          行缓冲 = 剩余缓冲                 判断循环尾 ()                          置转化进度 (“残留数据读取失败,放弃”)          置转化进度 (“管道已空,无残留数据”)            如果 (取字节集长度 (行缓冲 ) > 0 )    置转化进度 (“处理最后剩余的行(无换行符)”)     当前文本 = 取字节集数据 (行缓冲, #文本型, )     完整输出 = 完整输出 + 当前文本      行缓冲 = { }                  跳出循环 ()       置转化进度 (“非预期错误,退出循环”)   跳出循环 ()         GetExitCodeProcess (进程信息.进程句柄, 退出码临时 )  如果 (退出码临时 ≠ #STILL_ACTIVE )  置转化进度 (“进程已正常退出,退出码=” + 到文本 (退出码临时 ))      如果 (取字节集长度 (行缓冲 ) > 0 )   置转化进度 (“处理进程退出前的最后数据”)    当前文本 = 取字节集数据 (行缓冲, #文本型, )    完整输出 = 完整输出 + 当前文本     行缓冲 = { }          退出码 = 退出码临时  跳出循环 ()    程序_延时 (10, )     判断循环尾 ()置转化进度 (“循环结束,共循环 ” + 到文本 (循环计数 ) + “ 次”) 如果真 (退出码 = 0 ) WaitForSingleObject (进程信息.进程句柄, 5000 ) GetExitCodeProcess (进程信息.进程句柄, 退出码 ) CloseHandle (hRead )CloseHandle (进程信息.进程句柄 )CloseHandle (进程信息.线程句柄 )置转化进度 (“资源已释放,最终退出码=” + 到文本 (退出码 )) 最终输出 = 完整输出 返回 (退出码 = 0 )
|
|