【问题标题】:ffmpeg fails when running non-interactivelyffmpeg 在非交互式运行时失败
【发布时间】:2020-07-15 22:42:51
【问题描述】:

我正在向我的孩子展示一些使用 ffmpeg 编写的基本脚本,以向他展示自动化是多么容易。

当然,失败得很惨。

具体来说,我们编写了一个简单的 Python 脚本,输出如下内容:

ffmpeg -ss 0:00:00 -t 1:00:00 -i wholebook.mp3 'Part 01.opus'
ffmpeg -ss 1:00:00 -t 1:00:00 -i wholebook.mp3 'Part 02.opus'
ffmpeg -ss 2:00:00 -t 1:00:00 -i wholebook.mp3 'Part 03.opus'
.
.
.

效果很好,然后我将它传送到 bash:python script.py | bash

ffmpeg 转换了第一部分,然后开始为其余的大部分内容吐出错误和数据转储。 (好吧,第 15 部分也是正确的。)

依次复制/粘贴每个命令都可以正常工作。

将输出更改为.mp3 没关系;读取输入时似乎出错了。

为什么将这些命令传递给 bash 失败?

更新:它不只是将它传递给 bash。如果他不是剪切和粘贴每个命令并等待它完成,而是将整个命令系列剪切并粘贴到终端中(运行 bash),它会以同样的方式失败。

错误输出以:

开头
stream #0:
  keyframe=1
  duration=0.026
  dts=426.005  pts=426.005
  size=418
stream #0:
  keyframe=1
  duration=0.026
  dts=426.031  pts=426.031
  size=418
stream #0:
  keyframe=1
  duration=0.026
  dts=426.057  pts=426.057
  size=418

并持续数千行。在某些时候,它会切换到:

stream #0:
  keyframe=1
  duration=0.026
  dts=764.473  pts=764.473
  size=418
00000000  ff fb 92 64 f0 89 f5 f8 6c 3f 83 2c 4b 52 00 00 ...d....l?.,KR..
00000010  0d 20 00 00 01 19 55 b0 fe ad 31 37 08 00 00 34 . ....U...17...4
00000020  80 00 00 04 71 63 57 34 87 7a a1 ad 69 ab 77 53 ....qcW4.z..i.wS
00000030  fd fb 88 28 d3 10 b2 66 9f 99 dc 82 46 27 44 a2 ...(...f....F'D.
00000040  75 a8 5d b1 83 34 9a 5e bd 72 59 b1 11 1e 0a b8 u.]..4.^.rY.....
00000050  6d e9 d1 61 94 5c b6 92 ac cf 16 4b 74 d4 7c b7 m..a.\.....Kt.|.
00000060  ab c7 7a 6a 6b 7e f1 4e 55 fc 69 dd 2a f0 e1 21 ..zjk~.NU.i.*..!
00000070  09 10 25 09 a8 79 fe d1 da cb 34 06 8a 08 28 21 ..%..y....4...(!
00000080  47 6d 5d b6 06 f1 57 af 59 7b 75 86 60 a8 dd 99 Gm]...W.Y{u.`...
00000090  a4 87 45 aa 90 e1 67 74 78 30 a1 83 08 ce d9 ee ..E...gtx0......
000000a0  4f cf 22 f8 a3 46 4a a1 7c 7b a1 e6 59 df 76 86 O."..FJ.|{..Y.v.
000000b0  53 c5 5e 85 1d 39 57 ac a3 0e c5 03 93 51 f6 c6 S.^..9W......Q..
000000c0  86 2b 9c e1 33 27 59 c8 96 76 db 1c 96 42 58 93 .+..3'Y..v...BX.
000000d0  ce 46 83 44 a2 48 e5 66 0a 60 30 70 27 bc 3f 2a .F.D.H.f.`0p'.?*
000000e0  2d d9 6d 4d d9 79 41 7c d8 fc a9 64 35 af 88 eb -.mM.yA|...d5...
000000f0  15 a4 32 b2 73 0b 18 88 04 81 c9 60 48 ba 97 54 ..2.s......`H..T
00000100  24 89 28 65 e4 8b 0e ce 11 a1 19 39 05 0e 0f 31 $.(e.......9...1
00000110  62 e7 9a 3d 5c 3e b9 64 69 4f f6 f1 1d 19 bb 8f b..=\>.diO......
00000120  e1 29 60 b8 d6 ca 35 f8 ce 50 d4 9f dd 4a e3 d7 .)`...5..P...J..
00000130  79 d3 75 8e 15 67 c9 8b ac d9 a5 6a fa 43 47 10 y.u..g.....j.CG.
00000140  d1 46 fd 9c 93 d8 a3 33 74 2e 80 00 82 94 4c f3 .F.....3t.....L.
00000150  0e 02 8c 07 41 31 48 95 d8 f2 85 89 38 5e 65 37 ....A1H.....8^e7
00000160  76 dd 2b 2e c5 1c 39 13 9b 9b ae ab 25 cc 79 45 v.+...9.....%.yE
00000170  1e 60 1d b0 20 cf d2 12 cc 80 57 9b 99 65 78 9c .`.. .....W..ex.
00000180  82 a3 03 c0 b2 11 6b a5 49 c2 85 bd 3f 90 d5 73 ......k.I...?..s
00000190  13 f4 9e c5 29 23 0a 2a 25 c5 9d eb 5e 9c 95 c9 ....)#.*%...^...
000001a0  ec aa                                           ..
stream #0:
  keyframe=1
  duration=0.026
  dts=764.500  pts=764.500
  size=418
00000000  ff fb 92 64 ea 80 f5 14 69 41 cb 0c 34 72 00 00 ...d....iA..4r..
00000010  0d 20 00 00 01 1b 49 b0 fc ac bd 91 88 00 00 34 . ....I........4
00000020  80 00 00 04 5b 32 ac c2 16 a8 6d 65 8d 09 c5 3b ....[2....me...;
00000030  64 81 da 43 d5 27 4a 3d b1 8d c1 f5 95 ba e9 61 d..C.'J=.......a
00000040  62 a7 6a 5e 5d ab 58 7a 23 b7 8a f5 3f 2a 59 62 b.j^].Xz#...?*Yb
...

【问题讨论】:

  • 在您的问题中添加确切的错误消息(无评论)。

标签: bash ffmpeg


【解决方案1】:

ffmpeg 也从标准输入读取,以允许您更改选项或以交互方式退出。这意味着您用于 bash 的命令改为由ffmpeg 读取,例如q 将导致它退出。

您可以改为:

  • 直接从 Python 运行命令,而不是将命令写入 bash。这通常更健壮,因为您不必进行任何 shell 转义。

  • 使用ffmpeg -nostdin ...ffmpeg < /dev/null ... 防止ffmpeg 消耗标准输入。

  • 在一行前面加上{,在一行后面加上}。这样,bash 会预先将所有命令作为一个组读取,因此 ffmpeg 没有剩余的标准输入。

【讨论】:

  • 哦,哇。回想起来如此明显,前面如此神秘。谢谢!这是我当天谦卑的一课。我想现在我想知道为什么 ffmpeg 不检查 tty。但我知道有些人对此持有哲学上的反对意见。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多