我正在尝试使用 ffmpeg 和 x264 将动画 GIF 转换为 MP4 文件。然而,我似乎受到ffmpeg 中这个错误的影响,导致 GIF 最后一帧的延迟时间被忽略。对于非常短的 GIF,这是一个很大的问题。
作为一种解决方法,我认为我应该能够手动告诉 ffmpeg 在最后一帧上冻结一定时间,特别是该帧的适当持续时间(我可以从 GIF 中提取)。但是,我似乎找不到一个好的方法来做到这一点。有什么建议么?我真的希望能够做到这一点,而不必在将 GIF 放入 ffmpeg 之前将其分割成帧,因为这会用非恒定帧速率(除了速度慢得多)搞乱 GIF。
我使用的是 ffmpeg 2.3 版,尽管我也用最新的 git 代码尝试过,但没有任何改进。我使用的完整 ffmpeg 命令如下所示:
ffmpeg -i animation.gif -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2" -c:v libx264 -b:v 2000k -y -pix_fmt yuv420p -f mp4 animation.mp4
Run Code Online (Sandbox Code Playgroud)
这是一些控制台输出:
ffmpeg version 2.3 Copyright (c) 2000-2014 the FFmpeg developers
built on Aug 11 2014 21:19:46 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --enable-gpl --enable-libass --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libx264
libavutil 52. 92.100 / …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用命名管道在PHP中进行一些IPC.我有一个名为pipe的管道
$pipePath = __DIR__ . '/pipe';
posix_mkfifo($pipePath, 0600);
Run Code Online (Sandbox Code Playgroud)
在完成一些计算之后,还有另一个进程应写入该管道.我可以等待它完成并用以下内容读取结果:
$result = file_get_contents($pipePath);
Run Code Online (Sandbox Code Playgroud)
或者更冗长
$in = fopen($pipePath, 'r');
$result = fread($in, 8192);
fclose($in);
Run Code Online (Sandbox Code Playgroud)
(我简化了第二种方法;在实际代码中,我会检查错误,fread在循环中运行,以防结果> 8192字节,等等)
但是,虽然其他进程应该完成,但我不相信它会成功,所以我想尝试读取结果时超时.在等待一段时间之后,我想放弃并报告错误,说它崩溃等等.给出两种方法,PHP代码将永远挂起(或者很长一段时间)等待写入管道的东西.具体来说,file_get_contents和fread将挂起.
我能想出的唯一解决方案是这样的:
$timeout = 10; //seconds
for ($i = 0; $i < $timeout; $i++) {
$in = @fopen($pipePath, 'rn');
if ($in) break;
sleep(1);
}
if (!$in) {
throw new RuntimeException("The other process did not finish in the allotted time");
}
$result = fread($in, 8192);
fclose($in);
Run Code Online (Sandbox Code Playgroud)
这使用未记录的 …
假设我有一个非常简单的表,如下所示:
CREATE TABLE `t1` (
`key_part1` INT UNSIGNED NOT NULL,
`key_part2` INT UNSIGNED NOT NULL,
`value` TEXT NOT NULL,
PRIMARY KEY (`key_part1`, `key_part2`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
使用这个表,我想发出这样的查询:
SELECT *
FROM `t1`
ORDER BY `key_part1` ASC, `key_part2` DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
我曾希望ORDER BY此查询中的 索引会满意。但是,根据MySQL 文档:
在某些情况下,MySQL 无法使用索引来解析
ORDER BY,尽管它仍然使用索引来查找与WHERE子句匹配的行。这些案例包括:
- 你混合
ASC和DESC:
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
我尝试了一个类似于上述查询的查询,正如预期的那样,EXPLAIN输出表明这样的查询执行文件排序。这对我来说并不完全有意义,因为我可以执行以下操作:
SELECT *
FROM `t1`
WHERE `key_part1` = (
SELECT …Run Code Online (Sandbox Code Playgroud) animated-gif ×1
ffmpeg ×1
fopen ×1
indexing ×1
ipc ×1
linux ×1
mysql ×1
php ×1
sql-order-by ×1