小编Aus*_*tin的帖子

ffmpeg 减少动画 GIF 最后一帧的时间延迟

我正在尝试使用 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)

ffmpeg animated-gif

6
推荐指数
1
解决办法
3215
查看次数

如何使用命名管道在fopen上设置超时

我正在尝试使用命名管道在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_contentsfread将挂起.

我能想出的唯一解决方案是这样的:

$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)

这使用未记录的 …

php linux fopen ipc

6
推荐指数
1
解决办法
807
查看次数

如果混合使用 ASC 和 DESC,为什么 MySQL 不能为 ORDER BY 使用索引?

假设我有一个非常简单的表,如下所示:

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子句匹配的行。这些案例包括:

  • 你混合ASCDESC

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)

mysql indexing sql-order-by

5
推荐指数
1
解决办法
1646
查看次数

标签 统计

animated-gif ×1

ffmpeg ×1

fopen ×1

indexing ×1

ipc ×1

linux ×1

mysql ×1

php ×1

sql-order-by ×1