转码在编码即将结束时挂起

转码在编码即将结束时挂起

我正在尝试对一些 Firefly 剧集进行编码,以便我的妻子可以在她的上网本上观看它们(没有 DVD 驱动器!)。

我正在使用 dvd::rip,并且转码似乎在文件末尾附近编码期间随机挂起。

如果我终止并重新启动编码,它有时会越过失败的点,但是我遇到了一个特定的章节,它一直挂起。

具体命令为:
transcode -H 10 -a 0 -x vob -i ../vob/001-C006 -w 1437,50 -b 160,0,2 -s 1.496 --a52_drc_off -J normalize -f 30,4 -M 2 --export_par 118,100 -y xvid,null --psu_mode --nav_seek firefly1-001-C006-nav.log --no_split --progress_meter 1 --progress_rate 25 -o /dev/null -R 1

它打印的最后一行是:
encoding frames [0-5900], 59.76 fps, CFT: 0:03:16, (13| 0| 7)


我也尝试过进行一次编码:
transcode -H 10 -a 0 -x vob -i ../vob/001-C002 -w 5 -b 160,0,2 -s 1.496 --a52_drc_off -J normalize -f 30,4 -M 2 --export_par 118,100 -y xvid,null --psu_mode --no_split --progress_meter 1 --progress_rate 1 -o ../avi/001/firefly1-001-C002.avi

有时打印后它会挂起:
encoding frames [0-10545], 41.21 fps, CFT: 0:05:51, (17| 0| 3)

有时它会完成:
[transcode] encoded 10546 frames (-2104 dropped, 0 cloned), clip length 351.88 s


是否有任何我可以打开的调试/更多信息?有人有什么建议吗?

发行版:openSuSE 11.2

内核 uname -aLinux challenger 2.6.31.8-0.1-desktop #1 SMP PREEMPT 2009-12-15 23:55:40 +0100 i686 i686 i386 GNU/Linux

转码版本: transcode-1.1.5-0.pm.8.3.i586

答案1

您是否尝试过其他工具,例如手刹? 如果它挂在同一个位置,那么可能是光盘上有划痕,导致无法很好地翻录源数据。

其他可以尝试的 Linux 编码工具包括ffmpeg门编码器


更新:阅读转码常见问题解答关于各种问题。特别是,有一个已知问题会导致挂起:

我仍有一个问题,之前还没有讨论过。

如果您遇到的问题是转码立即“挂起”,或者甚至过了一段时间后,“挂起”的情况,那么您可能遇到了古老的线程版本问题。

如果以这种方式运行转码:"env LD_ASSUME_KERNEL=2.4.0 transcode ..." 可以解决问题,那么就是线程版本问题,而不是转码问题。

看:http://people.redhat.com/drepper/assumekernel.html

这个建议似乎很老套,很可能已经过时了,但尝试一下也无妨。我不确定“古老的线程版本”是什么意思;我猜它是指系统上的线程库与用于编译的线程库不匹配转码您正在使用的软件包。(我还假设您安装了转码作为二进制包,可能通过系统的包管理器,可能从非标准存储库下载?)

如果是这样的话,你可以通过编译自己的本地副本来消除不匹配的情况转码(对于基于 RPM 的包管理器,这需要找到用于编译二进制文件的 SRPM转码包,安装编译 transcode 所需的所有包,并使用 RPM 构建一个新的转码包裹。)

答案2

真是老话题了,但由于我遇到了同样的问题(transcode 在每一章结束时都挂起,尽管我没有使用 DVD:RIP 作为 transcode 的驱动程序),我认为我的 hack 解决方案可能对某些人有帮助。我发现 transcode 只是进入休眠状态,可能在等待一个永远不会到达或太早到达的信号。所以我所做的就是检测何时发生这种情况并使用以下 bash 脚本终止 transcode:

#!/bin/bash
while ps -C transcode|grep -q transcode; do
  # wait for transcode to actually start encoding
  sleep 15
  # detect when it goes to sleep
  while ps -C transcode --no-headers -o "stat"| grep -q -v "^S"; do
    sleep 1
  done
  echo "transcode process sleeping, waiting ten seconds"
  # sometimes seems to just get the signa/whatever it's waiting for
  sleep 10
  if ps -C transcode --no-headers -o "stat"| grep -q "^S"; then
    echo "still sleeping, killing transcode"
    killall transcode
  fi
  # wait here so that the driver program has a chance of restarting it
  sleep 10
done

此脚本与驱动程序同时运行,基本上取代了您查看该死的进程列表以查看 transcode 是否再次处于休眠状态。当然有更好的方法来编写它,但这只适合我,而且我很懒 :-)

答案3

也许它与问题本身无关,但是您使用了-o /dev/null,那(如果我没错的话)就像说“让我放弃输出”......我会尝试-o ~/Desktop/firefly_001.avi或任何您希望的扩展。

我希望尽快获得你的消息,

问候

相关内容