Time 如何获得以秒为单位的视频持续时间?
如何获得以秒为单位的视频持续时间 我所尝试的:Time 如何获得以秒为单位的视频持续时间?,time,awk,ffmpeg,duration,Time,Awk,Ffmpeg,Duration,如何获得以秒为单位的视频持续时间 我所尝试的: ffmpeg -i file.flv 2>&1 | grep "Duration" Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s mediainfo file.flv | grep Duration Duration : 39mn 43s 这很接近,但不是很准确,2383是39.71分钟 ffmpeg -i file.flv 2>&1
ffmpeg -i file.flv 2>&1 | grep "Duration"
Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s
mediainfo file.flv | grep Duration
Duration : 39mn 43s
这很接近,但不是很准确,2383是39.71分钟
ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383
2383是正确的。一分钟有60秒,而不是100秒。43/60=.71 使用awk
mediainfo file.flv | awk '/Duration/ {print $3*60+$4}'
2383
ffmpeg -i file.flv 2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
2383.08
要处理不同的格式,请使用以下命令:
cat file
Duration : 39mn 43s
Duration : 39s 43ms
awk'/Duration/{for(i=3;i有一个更好、更快和低CPU/HD占用空间的解决方案,只使用mediainfo而不依赖于awk:
mediainfo --Inform="General;%Duration%" input.m4v
你可以用
ffprobe -v quiet -print_format xml -show_format -show_streams inputfile.flv
它将返回如下所示的xml
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
<streams>
<stream index="0" codec_name="h264" codec_long_name="H.264 / AVC / MPEG-4 AVC /
MPEG-4 part 10" profile="High" codec_type="video" codec_time_base="1/50" codec_tag_string="avc1" codec_tag="0x31637661" width="1920" height="1080" has_b_frames="2" sample_aspect_ratio="0:1" display_aspect_ratio="0:1" pix_fmt="yuvj420p" level="40" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/12800" start_pts="0" start_time="0.000000" duration_ts="50176" duration="3.920000" bit_rate="4347640" nb_frames="98">
<disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0"/>
<tag key="language" value="eng"/>
<tag key="handler_name" value="VideoHandler"/>
</stream>
<stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" codec_type="audi
o" codec_time_base="1/48000" codec_tag_string="mp4a" codec_tag="0x6134706d" sample_fmt="fltp" sample_rate="48000" channels="2" bits_per_sample="0" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/48000" start_pts="-1024" start_time="-0.021333" duration_ts="189184" duration="3.941333" bit_rate="122277" nb_frames="185">
<disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0"/>
<tag key="language" value="eng"/>
<tag key="handler_name" value="SoundHandler"/>
</stream>
</streams>
<format filename="inputfile.flv" nb_streams="2" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime / MOV" start_time="-0.021333" duration="3.942000" size="2194901" bit_rate="4454390">
<tag key="major_brand" value="isom"/>
<tag key="minor_version" value="512"/>
<tag key="compatible_brands" value="isomiso2avc1mp41"/>
<tag key="encoder" value="Lavf54.63.100"/>
</format>
</ffprobe>
然后按视频流进行过滤,即通常使用属性index=“0”进行过滤,并获取属性“duration”的值,该值已经以秒为单位。如果安装了ffmpeg
,则很可能也安装了ffprobe
ffprobe -i file.mp4 -show_format -v quiet | sed -n 's/duration=//p' | xargs printf %.0f
该命令将返回一个整数值
输出示例:
190
它对我有用试试看:)
如果您有ffmpeg,您也应该有ffprobe。它以一系列键=值对的形式将信息输出到标准输出,并在默认情况下以秒为单位给出持续时间(如果需要hh:mm:ss,您必须使用-sexagesimal
选项):
我在php中使用了这个:
exec('mediainfo --Inform="General;%Duration%" ' . $filename, $output);
// type 86 sec = 85962.695312
$durationInSec = ceil(ceil($output[0])/1000);
谢谢Jotne,这正是我要找的!发现了一个bug。如果视频长度小于1min,那么你的mediainfo示例就不能正确执行,因为mediainfo以不同的格式输出时间,例如:持续时间:36s 360ms
,结果是在2520中使用你的代码。请修复。@IliaRostovtsev你是海报的同一个人吗对于问题user2783132
?不!:)他也有同样的问题,我现在可以告诉你。@iliastovtsev看到我更新的帖子了,我也想要一个hh:mm:ss.ms格式的输出,但是我不得不稍微修改你建议的命令以获得我需要的。我用常规替换了视频,以给出命令--Inform=“常规;%Duration/String3%”
.MediaInfo版本0.7.69您没有将值转换为秒,而是将毫秒部分切掉,而不是四舍五入。因此,您的结果不准确。您可以轻松地切掉Rodrigo答案给出的值的最后3位数字,省去php和字符串解析的迂回过程。@trs同意。我不喜欢自己的旧answer,因此我对其进行了编辑。请注意,这将为您提供毫秒,因此比任何grep
/awk
变体都更精确。例如:mediainfo--Inform=“General;”%Duration%”video.mp4
-->204466
而mediainfo.mp4 | grep'^Duration'
-->持续时间:3分钟24秒
(=204000ms)
$duration = shell_exec("ffmpeg -i \"". $input . "\" 2>&1");
preg_match("/Duration: (\d{2}:\d{2}:\d{2}\.\d{2})/",$duration,$matches);
$time = explode(':',$matches[1]);
$hour = $time[0];
$minutes = $time[1];
$seconds = round($time[2]);
$total_seconds = 0;
$total_seconds += 60 * 60 * $hour;
$total_seconds += 60 * $minutes;
echo $total_seconds += $seconds;
ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2
exec('mediainfo --Inform="General;%Duration%" ' . $filename, $output);
// type 86 sec = 85962.695312
$durationInSec = ceil(ceil($output[0])/1000);