我看了很多问题,但仍然无法弄清楚这一点.我正在使用PyQt,我希望运行ffmpeg -i file.mp4 file.avi并获取输出,因为我可以创建一个进度条.
我看过这些问题: ffmpeg可以显示进度条吗? 从子进程实时捕获stdout
我能够使用以下代码查看rsync命令的输出:
import subprocess, time, os, sys
cmd = "rsync -vaz -P source/ dest/"
p, line = True, 'start'
p = subprocess.Popen(cmd,
shell=True,
bufsize=64,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
for line in p.stdout:
print("OUTPUT>>> " + str(line.rstrip()))
p.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
但是当我更改命令时,ffmpeg -i file.mp4 file.avi我没有收到任何输出.我猜这与stdout/output缓冲有关,但是我不知道如何读取看起来像的行
frame= 51 fps= 27 q=31.0 Lsize= 769kB time=2.04 bitrate=3092.8kbits/s
Run Code Online (Sandbox Code Playgroud)
我可以用来计算进度.
有人可以告诉我一个如何从ffmpeg获取此信息到python的示例,无论是否使用PyQt(如果可能)
编辑: 我最终使用jlp的解决方案,我的代码看起来像这样:
#!/usr/bin/python
import pexpect
cmd = 'ffmpeg -i file.MTS file.avi'
thread = pexpect.spawn(cmd)
print "started %s" % cmd …Run Code Online (Sandbox Code Playgroud) 我用PHP编写了一个完整的系统,并在服务器上使用bash在我的VPS上转换和流式传输HTML5中的视频.转换由ffmpeg在后台完成,内容输出到block.txt.
看过以下帖子:
和
除其他外,我找不到一个有效的例子.
我需要以百分比的形式获取当前编码的进度.
我上面链接的第一篇文章给出了:
$log = @file_get_contents('block.txt');
preg_match("/Duration:([^,]+)/", $log, $matches);
list($hours,$minutes,$seconds,$mili) = split(":",$matches[1]);
$seconds = (($hours * 3600) + ($minutes * 60) + $seconds);
$seconds = round($seconds);
$page = join("",file("$txt"));
$kw = explode("time=", $page);
$last = array_pop($kw);
$values = explode(' ', $last);
$curTime = round($values[0]);
$percent_extracted = round((($curTime * 100)/($seconds)));
echo $percent_extracted;
Run Code Online (Sandbox Code Playgroud)
$ percent_extracted变量回零,由于数学不是我的强项,我真的不知道如何在这里取得进展.
这是来自block.txt的ffmpeg输出的一行(如果它有用)
时间= 00:19:25.16比特率= 823.0kbits/s帧= 27963 fps = 7 q = 0.0 size = 117085kB时间= 00:19:25.33比特率= 823.1kbits/s帧= 27967 fps = 7 …
我目前正在帮助某人进行反应时间实验.对于该实验,测量键盘上的反应时间.对于这个实验,重要的是要知道,由于按键和软件中的处理之间的延迟,可以引入多少错误.
以下是我使用谷歌发现的一些因素:
不幸的是,无法控制实验的低级逻辑.该实验用E-Prime编写,该软件通常用于此类实验.然而,提供E-Prime的公司还提供额外的硬件,他们为精确的反应时间做广告.因此他们似乎意识到这种效果(但不知道它有多大).
不幸的是,有必要使用标准键盘,所以我需要提供减少延迟的方法.
我使用ffmpeg的选择过滤器扫描输入视频以提取某些帧。该选择基于复杂的条件,并且无法预测提取的帧数(我正在进行场景检测,但这可能有所不同-例如选择所有I帧等)。
我需要显示扫描(解码)视频的百分比(例如10%或90%)。
我尝试了几种方法来解析控制台输出,就像人们在处理编码时通常所做的那样,但这对扫描进度没有帮助(例如ffmpeg可以显示进度条吗?还是ffmpeg进度条-PHP中的编码百分比)
ffmpeg -progress sceneProgr.txt -i input.wmv -vsync passthrough -an -vf select='gt(scene\,0.2)',showinfo scene%%05d.png
Run Code Online (Sandbox Code Playgroud)
产生的输出如下:
<..>
frame= 0 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:0 pts:16550 pts_time:16.55 pos:4205325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:1 type:I checksum:95895BC9 plane_checksum:[95895BC9]
frame= 1 fps=0.7 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A
n:1 pts:24591 pts_time:24.591 pos:6685325 fmt:rgb24 sar:0/1 s:640x480 i:P iskey:0 type:P checksum:FF4CC015 plane_checksum:[FF4CC015]
'frame=...' and 'n:...' lines are repeated for each of the extracted frames.
Run Code Online (Sandbox Code Playgroud)
双方frame=... …
我使用 ffmpeg 转换通过 ASPX 网页上传的视频文件。
ffmpeg转换效果很好。
我想为最终用户提供一个进度条。所以我在网页上放置了一个 updatePanel 并尝试读取文件大小......
执行此操作的正确/有效方法是什么?
由于 OBS Studio 缺乏视觉指示器来显示视频的进度(以及何时需要前进到下一个场景),我想知道是否有命令行选项(或解决方案)来让 FFMPEG 重新编码视频并在视频底部显示一个进度条,显示视频到目前为止已经播放了多长时间。
有这样的功能吗?