第一次发帖,请多多包涵 :)
简单介绍一下历史。我使用的是 tvheadend,内置转码器会消耗我的 CPU,并提供平均质量的输出(由 ffmpeg 提供支持),如果我将 tvheadend 的输出通过 ffmpeg 传输,我会获得更低的 CPU 使用率和更好的质量(很奇怪但确实如此)。(由于播放器功能有限,我不得不进行转码)
因此,在 tvheadend 中,http 链接来自类似
到
pipe:///usr/bin/ffmpeg -loglevel fatal -i http://avideostream -tune zerolatency -vcodec libx264 -preset veryfast -crf 28 -maxrate 1200k -bufsize 3500k -vf "scale='min(1280,iw)':'min(720,ih)'" -acodec aac -b:a 128K -f mpegts pipe:1
正如您所见,有很大差异。
这一切都有效,但是如果我想更改上述管道中的设置,我必须为所有链接更改它们(我通过脚本进行),但这意味着 tvheadend 重新导入并测试所有链接(因为它将它们视为已更改的链接,这很公平)。
所以我想要做的是将 ffmpeg 包装在某个东西中,这样我就可以更改包装器。(这一切都发生在最新的 ubuntu 服务器上)。
现在我可以很高兴地说我不是 Ubuntu 专家(甚至还差得远),尽管我已经运行自己的家庭服务器几年了。所以我并不完全了解“管道”的所有方面。
我看到的上述三个选项(到目前为止,我还没有找到为 tvheadend 选择外部转码器选项的方法,除非进入奇怪的构建,这是我想避免的)是:
对 ffmpeg 使用外部选项文件(我可以从控制台开始工作,但不能作为管道的一部分,例如 sudo ffmpeg -i amovie.mp4 $(cat ffmpegoptions.txt) convertmovie.mp4,它可能像文件访问权限一样简单,但我没有做太多调试)
将 ffmpeg 的内容放入 .sh 文件中(但这似乎会破坏管道,我甚至不知道从哪里开始)
将 ffmpeg 放入某种 python 脚本中(我甚至没有开始研究这个,这对我来说太过分了,我可以编写 python,但这目前超出了我的能力范围)
简短的版本,我想从以下开始:
tvheadend >> 通过管道传输到 ffmpeg >> 返回到 tvheadend >> 关闭到播放器
要么
tvheadend >> 通过管道传输到 .sh 或脚本包装器 >> 通过管道传输到 ffmpeg >> 返回到 tvheadend >> 关闭到播放器
或者
tvheadend >> 通过管道传输到 ffmpeg(由外部选项文件控制)>> 返回 tvheadend >> 关闭到播放器
任何建议/帮助都将不胜感激。如果我遗漏了任何重要信息,请告诉我。
答案1
我没有找到真正的答案,更多的是解决方法。由于这都是更大、更复杂的 plex 的一部分,我找到了一个代理(希特夫),其中包括 ffmpeg 转码,我可以设置 ffmpeg 的选项。这对于我想要做的事情来说已经足够好了。
希望这可以为别人节省一点时间。
答案2
关于将 ffmpeg 内容放入 .sh 文件中,我假设您将 pipe:/// 字符串放在 mux URL: 文本框中。在这种情况下,要调用脚本,您只需执行以下操作:
pipe:///path/to/script/yourscriptname.sh
然后在脚本中运行您想要的任何命令,最后执行的命令是将您的 ffmpeg 调用括在括号中,并在开头使用 ffmpeg 的完整路径而不是 pipe:///,在您的情况下,脚本中的最后一行可能是这样的:
(/usr/bin/ffmpeg -loglevel fatal -i http://avideostream -tune zerolatency -vcodec libx264 -preset veryfast -crf 28 -maxrate 1200k -bufsize 3500k -vf“scale='min(1280,iw)':'min(720,ih)'”-acodec aac -b:a 128K -f mpegts pipe:1)
需要注意的一点是,一旦脚本调用了 ffmpeg,脚本实际上就失去了控制权 - ffmpeg 调用之后的任何内容都不会执行。但是,您可以使用条件(例如 if - elif - else 等)来选择要执行的特定版本的 ffmpeg 命令,因为脚本只有在调用 ffmpeg 后才会失去控制权。因此,虽然您的 ffmpeg 调用不一定是脚本中的最后一行,但一旦调用了 ffmpeg,脚本就完成了,无论这是否是您的意图!