3

我想学习如何使用 ColdFusion 的 CFFILE 标签来读取文本文件的内容。就我而言,该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志。我想编写一个 ColdFusion 脚本,它会定期轮询进度日志,直到日志表明 FFMpeg 已完成其转码操作。在客户端,我可以使用 Ajax 来访问 ColdFusion 脚本并向用户显示“完成百分比”,而 FFMpeg 会执行其工作。

我让 FFMpeg 使用最新版本的 FFMpeg 现在支持的新“进度”标志来生成日志文件。下面我将向您展示使用此标志的方法,以及日志文件中生成的输出。

这是 FFMpeg 命令:

ffmpeg -i c:\my_original_file.ogg c:\my_converted_file.mp3 -progress c:\my_progress.txt

上述命令将导致 FFMpeg 生成一个名为 my_progress.txt 的日志文件。

这是它在日志文件中生成的内容:

total_size=206150
out_time_ms=51410044
out_time=00:00:51.410044
dup_frames=0
drop_frames=0
progress=continue

上述 6 行在日志文件中重复生成,值递增。

total_size=206150
out_time_ms=51410044
out_time=00:00:51.410044
dup_frames=0
drop_frames=0
progress=continue
total_size=412413
out_time_ms=102975756
out_time=00:01:42.975756
dup_frames=0
drop_frames=0
progress=continue
total_size=618363
out_time_ms=154463111
out_time=00:02:34.463111
dup_frames=0
drop_frames=0
progress=continue
total_size=824939
out_time_ms=206107189
out_time=00:03:26.107189
dup_frames=0
drop_frames=0
progress=continue

最后,当作业完成时,最后的 6 行块是日志文件中的最后一行。注意最后一行的“progress=end”:

total_size=9725902
out_time_ms=2431348011
out_time=00:40:31.348011
dup_frames=0
drop_frames=0
progress=end

我想使用 CFFILE 标记编写一个 Coldfusion 脚本,以仅读取文件的最后 6 行(无论文件有多大),并在每次浏览器通过 Ajax 调用脚本时执行此操作。最后,我需要将这些行上的值解析为变量,以便可以将一些数据返回给调用者。

我研究了 FFMpeg 的进度条,但它们使用 PHP,这对我来说很难,此外,它们解析 FFMpeg 日志文件的旧格式版本,我想使用上述较新的格式。有人可以帮忙吗?

4

2 回答 2

2

获得最后六行tail会更快,因为它向后工作并且只加载您要求的内容(而不是读取整个文件然后循环遍历它)。无论文件大小如何,它显然也会使用更少的内存。

<cfexecute
    name      = "tail"
    arguments = "--lines=6 #Filename#"
    timeout   = 30
    variable  = "LastSixLines"
    />

<cfset Data = {} />
<cfloop index="CurLine" array=#LastSixLines.trim().split('\n')# >
    <cfset Data[ListFirst(CurLine,'=')] = ListRest(CurLine,'=') />
</cfloop>


由于您似乎在 Windows 上,您可能需要安装 tail(它已为 Linux 和 MacOS 预装)。最简单的选择是MSYS,根据您使用的其他软件,您可能已经拥有它 - 例如,Windows 版 Git 使用 MSYS,并且在其 bin 文件夹中有 tail.exe。

在这种情况下,上面的第二行更改为:

    name      = "C:/Program Files/Git/bin/tail"

如果您需要代码在多个系统上工作,您可以将该部分设置为变量,(或将适当的目录放在系统 PATH 上,以便可以从任何地方调用它)。

于 2013-05-04T15:20:21.240 回答
0

这将读取您的文件并创建一个包含最后 6 行的结构。

<cffile action="read" file="myfile.txt" variable="myfile">

<cfoutput>
    <cfset linecount = listlen(myfile,chr(10))>
    #linecount# lines

    <cfset count = 0>
    <cfset stData = {}>
    <cfloop list="#myfile#" index="i" delimiters="#chr(10)#">
        <cfset count++>
        <cfif count GT linecount - 6><!--- we only care about the last 6 lines --->
            #i#<Br>
            <cfset stData[listfirst(i,'=')] = listlast(i,'=')><!--- add data to stData --->
        </cfif>
    </cfloop>
</cfoutput>
<cfdump var="#stData#">

上面的代码将从文本文件中输出原始数据,并根据=分隔符创建一个结构

您还可以将文件存储到一个数组中,然后像这样拉出最后 6 行。对于较小的文件(<200k 行),此选项的速度大约是 2 倍,但随着文件大小的增长,这两个选项几乎相同,然后第一个选项在大约 1M 行时变得更快

<cffile action="read" file="c:\ColdFusion10\cfusion\wwwroot\myfile.txt" variable="myfile">

<cfset filearray = listToArray(myfile,chr(10))>
<cfset linecount = arrayLen(filearray)>
<cfset stData = {}>
<cfloop from="0" to="5" index="i">
   <cfset stData[listfirst(filearray[linecount - i],'=')] = listlast(filearray[linecount - i],'=')>
</cfloop>

在此处输入图像描述

于 2013-05-04T01:14:45.170 回答