我曾经使用ffmpeg计算服务器端MP3文件的持续时间 - 这似乎工作正常.今天我发现有些计算错了.不知何故,由于某种原因,ffmpeg将错误地计算持续时间,并且它似乎只发生在可变比特率mp3文件中.
在本地测试时,我注意到ffmpeg以绿色打印了两条额外的线条.
使用的命令:
ffmpeg -i song_9747c077aef8.mp3
Run Code Online (Sandbox Code Playgroud)
ffmpeg说:
[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
Run Code Online (Sandbox Code Playgroud)
在一个不错的,温暖的谷歌会议之后,我发现了一些帖子,但没有找到解决方案.
然后我试着增加最长持续时间:
ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3
Run Code Online (Sandbox Code Playgroud)
在此之后,ffmpeg仅返回第二行:
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
Run Code Online (Sandbox Code Playgroud)
但在任何一种情况下,计算的持续时间都是完全错误的.将其与VLC进行比较我注意到持续时间是正确的.
经过更多的研究,我偶然发现了mp3info - 我安装和使用了它.
mp3info -p "%S" song_9747c077aef8.mp3
Run Code Online (Sandbox Code Playgroud)
然后mp3info返回CORRECT持续时间,但只作为一个整数,我不能使用,因为我需要一个更准确的数字.用户blahdiblah在下面的评论中解释了这个原因- mp3info只是从文件中提取ID3信息而不是实际执行任何计算.
我也尝试使用mplayer来检索持续时间,但就像ffmpeg一样,mplayer返回错误的值.
我怎样才能最好地将90060(秒)转换成一串"25h 1m"?
目前我在SQL中这样做:
SELECT
IF(
HOUR(
sec_to_time(
sum(time_to_sec(task_records.time_spent))
)
) > 0,
CONCAT(
HOUR(sec_to_time(sum(time_to_sec(task_records.time_spent)))),
'h ',
MINUTE(sec_to_time(sum(time_to_sec(task_records.time_spent)))),
'm'
),
CONCAT(
MINUTE(sec_to_time(sum(time_to_sec(task_records.time_spent)))),
'm'
)
) as time
FROM myTable;
Run Code Online (Sandbox Code Playgroud)
但我不确定这是最方便的方法:-)
我对在SQL(不同于我已经在做)或PHP中这样做的建议持开放态度.
编辑:
所需字符串的示例:"5m","40m","1h 35m","45h""46h 12m".
好的.其实我主要需要的是mp4格式.但是,如果有可能获得其他类型,那将是不错的.我只需要读取文件的持续时间.我怎么能用C#4.0做到这一点?
所以我需要的是这个视频就像: 13 minutes 12 seconds
我也可以使用3个第三方的前任.就像他们将有关文件的信息保存到文本文件中一样.我可以解析该文本文件.
谢谢.
有没有办法加快 的行为速度scrollTo?
我在黑暗中刺了一下speed,duration但不起作用!
window.scrollTo({
top: 1000,
behavior: "smooth"
});
Run Code Online (Sandbox Code Playgroud)
我需要确定两个DateTimes之间的持续时间(以分钟为单位).
然而,有一点点扭曲:
[09/30/2010 6:39:00
PM] - [09/30/2010 7:39:00 PM] = 21
Minutes我只是很难找到一个体面的方式去做,如果有人能提出建议,我会很感激.
谢谢.
编辑:
我最终选择了dtb的解决方案.只有一个特殊情况需要注意:如果结束时间是在晚上7点之后,则计算从上午7点到实际结束时间的分钟数.
这是我修改它的方式:
var minutes = from day in start.DaysInRangeUntil(end)
where !day.IsWeekendDay()
let st = Helpers.Max(day.AddHours(7), start)
let en = (day.DayOfYear == end.DayOfYear ?
end :
Helpers.Min(day.AddHours(19), end)
)
select (en - st).TotalMinutes;
Run Code Online (Sandbox Code Playgroud)
再一次感谢你的帮助.
我想尝试转换这样的时间戳:
2015-06-27T09:34:22+00:00
Run Code Online (Sandbox Code Playgroud)
到格式的时间所以它会说像9个月前1天2小时30分2秒.
类似的东西.
我使用time.Parse并time.Since达到这个目的:
6915h7m47.6901559s
Run Code Online (Sandbox Code Playgroud)
但是我如何从那里转换?这样的事情就是我想的:
for hours > 24 {
days++
hours -= 24
}
Run Code Online (Sandbox Code Playgroud)
但问题是,这个月不准确,因为几个月可能有28天,30天和31天.
有没有更好的方法来实现我想要的?
我想将格式为HH:MM:SS或MM:SS或SS的字符串转换为持续时间的数据类型.
解:
private ArrayList<Duration> myCdDuration = new ArrayList<Duration>();
private void convert(String aDuration) {
chooseNewDuration(stringToInt(splitDuration(aDuration))); //stringToInt() returns an int[] and splitDuration() returns a String[]
}
private void chooseNewDuration(int[] array) {
int elements = array.length;
switch (elements) {
case 1:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, 0, array[0]));
break;
case 2:
myCdDuration.add(newDuration(true, 0, 0, 0, 0, array[0], array[1]));
break;
case 3:
myCdDuration.add(newDuration(true, 0, 0, 0, array[0], array[1],
array[2]));
break;
}
}
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助...任何更简单的方法吗? - >创建自己的Duration类:
public class Duration {
private int intSongDuration;
private String …Run Code Online (Sandbox Code Playgroud) 我有一个 Google 文档,在一列中列出了一堆hh:mm持续时间,例如:
1:30
1:00
0:30
Run Code Online (Sandbox Code Playgroud)
我正在SUM(D2:D24)总结,最近总时间hh:mm超过了24小时,所以我的总时间超过了24小时,结果显示0:15。
具体来说,在 Google Sheets 上,我将如何设置总单元格的格式以使其超过 24:00?
我刚刚开始学习HTML5,并使用JQuery浏览HTML5音频播放器.我用播放列表编写了一个播放器,一切正常,除了持续时间,我的输入范围滑块不起作用.当我调试时,我发现我的持续时间显示为NAN.我正在设置歌曲初始化后的持续时间.
这是我的JS代码
jQuery(document).ready(function() {
container = $('.container');
playList = $('#playlist');
playListSong = $('#playlist li');
cover = $('.cover');
play = $('#play');
pause = $('#pause');
mute = $('#mute');
muted = $('#muted');
close = $('#close');
song = new Audio('music/Whistle-Flo-Rida-Mp3-Download.mp3','music/Whistle-Flo-Rida-Mp3-Download.mp3');
var canPlay = song.canPlayType('audio/mpeg;');
if (canPlay) {
song.type= 'audio/mpeg';
song.src= 'music/Whistle-Flo-Rida-Mp3-Download.mp3';
}
playListSong.click(function(){
$('#close').trigger('click');
window["song"] = new Audio('music/'+$(this).html()+'.mp3','music/'+$(this).html()+'.mp3');
$('#play').trigger('click');
});
play.live('click', function(e) {
e.preventDefault();
song.play();
//cover.attr("title", song.duration);
$(this).replaceWith('<a class="button gradient" id="pause" href="" title=""><span>k</span></a>');
$('#close').fadeIn(300);
$('#seek').attr('max',song.duration);
});
pause.live('click', function(e) {
e.preventDefault();
song.pause();
$(this).replaceWith('<a class="button gradient" …Run Code Online (Sandbox Code Playgroud) 什么是最好的方法?
我有一个用户将上传视频的字段.
单击上传按钮时,视频上传.这工作完美.
我需要物理路径的视频持续时间,我试过:
using WMPLib;
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
IWMPMedia mediaInfo = wmp.newMedia(Server.MapPath("~/Uploads/test.mp4"));
double duration = mediaInfo.duration;
Run Code Online (Sandbox Code Playgroud)
但它不起作用,我得到错误:
类型'WMPLib.WindowsMediaPlayerClass'没有定义构造函数,无法嵌入Interop类型'WMPLib.WindowsMediaPlayerClass'.
如何抓住持续时间?