如何从ffmpeg输出中提取持续时间?

要获得关于媒体文件的大量信息,可以做

ffmpeg -i <filename> 

在哪里输出很多线路,特别是一个线路

 Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s 

我只想输出00:08:07.98 ,所以我试试

 ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: \(.*\), start/\1/g' 

但是它可以印刷一切,而不仅仅是长度。

甚至ffmpeg -i file.mp4 | grep Duration ffmpeg -i file.mp4 | grep Duration输出一切。

我怎样才能得到持续时间的长度?

ffmpeg正在写信息到stderr ,而不是stdout 。 尝试这个:

 ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g' 

注意stderrredirect到stdout2>&1

编辑:

你的sed语句也不行。 尝试这个:

 ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d , 

你可以使用ffprobe

 ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0" 

它将以秒为单位输出持续时间,如:

 154.12 

添加-sexagesimal选项将输出持续时间,以小时为单位:minutes:seconds.microseconds

 00:02:34.12 

根据我的经验,许多工具以某种表格/有序结构提供所需的数据,并提供参数来收集数据的特定部分。 这适用于例如smartctl,nvidia-smi和ffmpeg / ffprobe。 简而言之 – 通常不需要在这些任务上input数据或打开子壳体。

因此,我会使用正确的工具进行工作 – 在这种情况下,ffprobe会以秒为单位返回原始持续时间值,之后可以自行创build所需的时间格式:

 $ ffmpeg --version ffmpeg version 2.2.3 ... 

该命令可能会根据您使用的版本而有所不同。

 #!/usr/bin/env bash input_file="/path/to/media/file" # Get raw duration value ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "$input_file" 

一个解释:

“-v quiet”:除了所需的原始数据值之外,不要输出任何内容

“-print_format”:使用特定的格式打印出数据

“compact =”:使用紧凑的输出格式

“print_section = 0”:不要打印部分名称

“:nokey = 1”:不要打印键值对

“:escape = csv”:转义值

“-show_entries format = duration”:在名为format的节中获取名为duration的字段的条目

参考: ffprobe手册页

在一个请求参数的情况下,使用mediainfo及其输出格式是这样的(对于持续时间;以毫秒为单位)

 amber ~ > mediainfo --Output=General;%Duration% ~/work/files/testfiles/+h263_aac.avi 24840 
 ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,// 

给出输出

HH:MM:SS.milisecs

对于那些想要在Windows中没有附加软件的情况下执行相同的计算,这里是命令行脚本的脚本:

 set input=video.ts ffmpeg -i "%input%" 2> output.tmp rem search " Duration: HH:MM:SS.mm, start: NNNN.NNNN, bitrate: xxxx kb/s" for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (output.tmp) do ( if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m ) goto :EOF :calcLength set /A s=%3 set /A s=s+%2*60 set /A s=s+%1*60*60 set /A VIDEO_LENGTH_S = s set /A VIDEO_LENGTH_MS = s*1000 + %4 echo Video duration %1:%2:%3.%4 = %VIDEO_LENGTH_MS%ms = %VIDEO_LENGTH_S%s 

同样的答案张贴在这里: 如何从TSvideo最后N秒

我只是用一个文本文件在C ++中执行此操作并提取令牌。 为什么? 我不是一个像其他人一样的Linuxterminal专家。
设置它,我会在Linux中这样做..

ffmpeg -i 2>&1 | grep "" > mytext.txt

然后运行一些C ++应用程序来获取所需的数据。 也许提取所有重要的值,并通过使用令牌重新格式化它进一步处理。 我只需要自己的解决scheme,人们只会取笑我,因为我是一个Linux新手,我不喜欢脚本太多。

哎呀。 忘了那个。 看起来我必须从我的C和C ++编程中获得蜘蛛网,然后使用它。 我不知道所有的shell技巧,让它工作。 这是我得到了多less。

ffmpeg -i myfile 2>&1 | grep "" > textdump.txt

然后我可能会提取持续时间与C ++应用程序,而不是提取令牌。

我没有发布解决scheme,因为我现在不是一个好人

更新 – 我有我的方法来获得该持续时间的时间戳

第1步 – 获取媒体信息到文本文件
`ffprobe -i myfile 2>&1 | grep "" > textdump.txt`
要么
`ffprobe -i myfile 2>&1 | awk '{ print }' > textdump.txt`

步骤2 – 在需要的信息上提取并提取
cat textdump.txt | grep "Duration" | awk '{ print $2 }' | ./a.out
注意a.out。 这是我的C代码砍掉结果的逗号,因为输出是像00:00:01.33,
这里是使用stdin并输出正确信息的C代码。 我不得不采取大于和小于观察的迹象。

#include stdio.h #include string.h void main() { //by Admiral Smith Nov 3. 2016 char time[80]; int len; char *correct; scanf("%s", &time); correct = (char *)malloc(strlen(time)); if (!correct) { printf("\nmemory error"); return; } memcpy(correct,&time,strlen(time)-1); correct[strlen(time)]='/0'; printf("%s", correct); free(correct); }

现在输出格式正确,如00:00:01.33

你可以试试这个:

 /* * Determine video duration with ffmpeg * ffmpeg should be installed on your server. */ function mbmGetFLVDuration($file){ //$time = 00:00:00.000 format $time = exec("ffmpeg -i ".$file." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"); $duration = explode(":",$time); $duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]); return $duration_in_seconds; } $duration = mbmGetFLVDuration('/home/username/webdir/video/file.mov'); echo $duration; 

已经用avconvreplace了ffmpeg:用路易斯·马拉西奥的答案replaceavconb。

 avconv -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start.*/\1/g' 

注意:在开始获得时间后,aditional。*