如何获取 DVD 中的标题和章节信息?

Posted

技术标签:

【中文标题】如何获取 DVD 中的标题和章节信息?【英文标题】:How to obtain titles and chapters information in DVD? 【发布时间】:2012-08-27 16:21:46 【问题描述】:

我发现了很多关于使用 ffmpeg 创建 DVD 菜单的问题,但我没有找到任何关于以编程方式访问 DVD 结构信息的问题。当我使用 libav(或 FFmpeg)库时,我可以打开 DVD 映像(iso 文件)并访问视频、音频和字幕流。但我找不到任何 API。

我可以使用 VLC 播放器(以及 libvlc 库)播放视频并找到信息。但我需要以编程方式对音频和字幕流进行一些处理。我不想使用 SmartRipper 之类的工具拆分 VOB,然后才进行处理。

libav(ffmpeg) 是否包含任何处理 DVD 菜单的 API?如果不能,您能否推荐任何其他可用于以一帧(样本,AVPacket)精度获取有关标题(章节)开始和结束时间的信息的库?

我听说过 libdvdnav 库,但我不知道它是否适合我。 我是 libav 和 DVD 格式内部的新手。

【问题讨论】:

尝试在您的 iso 文件上使用 ffmpeg 命令行实用程序,并查看它在屏幕上显示的信息种类。该命令类似于ffmpeg -i input.iso output.avi。如果它显示了您需要的信息,则意味着原则上可以使用 libav 访问它。 我已经尝试使用 ffprobe (avprobe) 它只显示流数及其类型。 我不确定 ffprobe 是否提供与 ffmpeg 相同的信息。我从来没有使用过ffprobe。您是否也尝试过使用ffmpeg -i input.iso output.avi 是的,我尝试转换为 avi。它还仅显示有关流计数和类型的信息。顺便说一句,ffmpeg 和 ffprobe 这两种工具都会显示第一个视频的长度。但是,当我将 iso 图像编码为 avi 格式并结束第一个视频时,它会继续下一个而没有任何消息。 【参考方案1】:

我不确定在这种情况下 1 帧精度意味着什么。然而,我一直在使用一个名为lsdvd 的工具,它是一个基本的 CLI 工具,它的唯一参数是 DVD 驱动器的块设备。 (没有那个参数,它会猜测/dev/dvd,这是现代 Linux 所缺少的,通常是/dev/sr0。)然后它会给你一个很好的光盘章节列表,如下所示:

$ lsdvd /dev/sr0
Disc Title: METAL_DISC_2
Title: 01, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 01
Title: 02, Length: 00:00:11.500 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 03, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 01
Title: 04, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 01
Title: 05, Length: 00:00:09.000 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 06, Length: 00:00:10.000 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 07, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 01
Title: 08, Length: 00:25:02.333 Chapters: 06, Cells: 06, Audio streams: 01, Subpictures: 00
Title: 09, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 10, Length: 00:07:48.700 Chapters: 16, Cells: 16, Audio streams: 01, Subpictures: 00
Title: 11, Length: 00:00:00.433 Chapters: 01, Cells: 01, Audio streams: 01, Subpictures: 00
Title: 12, Length: 00:16:43.066 Chapters: 08, Cells: 08, Audio streams: 01, Subpictures: 00
...snip...
Longest track: 20

如果您想编写自己的代码,我想查看lsdvd 的源代码会很有启发性。它在 Fedora 25 中链接的唯一库(标准库除外)是 libdvdread.so.4,它是 dvdnav 项目的一部分。

HTH。

【讨论】:

另请注意,您可以使用lsdvd -c 显示有关章节的详细信息。【参考方案2】:

Mplayer 可以做到这一点。我不熟悉他们的图书馆,但这可以让你开始

mplayer dvd:// -identify

结果

章节:00:00:00.000,00:03:40.200,00:07:29.500,00:12:04.033,00:16:17.199, 00:27:36.499,00:34:26.166,00:43:37.199,00:49:29.533,00:59:46.500,01:12:47.667, 01:17:09.000,01:26:13.700,01:47:15.833,01:50:06.200,01:55:25.500,02:06:42.500, 02:13:03.666,02:20:37.499,02:28:20.832,02:33:26.832,02:37:47.532,02:43:58.665, 02:51:00.165,02:56:36.165,03:01:21.998,03:05:09.331,03:07:14.665,03:11:49.665, 03:16:35.165,

【讨论】:

我添加了-frames 0 选项以防止实际播放视频。示例:mplayer -identify -frames 0 '/path/to/VIDEO_TS.IFO 2>/dev/null | grep CHAPTERS: 或者你可以过滤grep TITLE标题似乎每行一个【参考方案3】:

基本上你无法分辨,但你可以寻找最长的标题。

一个选项:使用handbrakecli -scan e:(手刹的一部分)

另一个:使用mplayer -identify dvd:// -dvd-device e:(mplayer 标准)

发件人:http://betterlogic.com/roger/2011/07/dvd-determine-main-title-from-command-line/

这对我有帮助,因为 VLC 在它的 GUI 菜单中列出了标题和章节

基本上,安装 VLC 媒体播放器,然后在其中播放您的 DVD。 浏览直到它“正在播放真正的标题”

然后转到播放[菜单] -> 标题,看看它当前是哪一个 突出显示。

现在您知道哪个标题是“主要”标题轨道。

来源:http://betterlogic.com/roger/2010/11/how-to-use-vlc-to-tell-how-many-titles-and-chapters-and-which-is-the-main/

【讨论】:

【参考方案4】:

我结合使用上述两种方法来创建 DVD 章节文件,稍后我可以使用 mkvmerge 将其添加到编码的 mkv 文件中:

#!/bin/bash
if [ $# -lt 1 ]; then
    echo "Usage: $0 filename title_no"
    exit 
fi

i=1
j2=01
filename=$1
echo "Using lsdvd to load chapter info:"
lsdvd -c ./
if [ -z "$2" ]; then
    echo -ne "What title number do you want to create chapter info for: "
    read title
else
    title=$2
fi
IFS=',' read -r -a CHAPTERS <<< `mplayer -identify -frames 0 "./VTS_0"$title"_0.IFO" 2>/dev/null | grep CHAPTERS: | sed 's/CHAPTERS: //'`

for chapter in "$CHAPTERS[@]"
do
    echo "Chapter $i: $chapter"
    let i++
done

echo -ne "Creating chapter data file...."
sleep 3
for chapter in "$CHAPTERS[@]"
do
    echo "CHAPTER$j2=$chapter" >> $filename.txt
    echo "CHAPTER"$j2"NAME=Chapter $j2" >> $filename.txt
    j2=$(printf %02d $((10#$j2 + 1 )))

done
echo "DONE."
echo "Chapter data file: $filename.txt"

示例输出:

$ read_chapters.sh whiteglasses_chapters
Using lsdvd to load chapter info: 
libdvdread: Couldn't find device name.
Couldn't read enough bytes for title.
Disc Title: unknown
Title: 01, Length: 00:00:21.000 Chapters: 01, Cells: 01, Audio streams: 00, Subpictures: 00
    Chapter: 01, Length: 00:00:21.000, Start Cell: 01
Title: 02, Length: 01:52:32.166 Chapters: 11, Cells: 12, Audio streams: 02, Subpictures: 01
    Chapter: 01, Length: 00:10:23.200, Start Cell: 01
    Chapter: 02, Length: 00:11:53.200, Start Cell: 02
    Chapter: 03, Length: 00:08:02.367, Start Cell: 03
    Chapter: 04, Length: 00:11:28.533, Start Cell: 04
    Chapter: 05, Length: 00:12:55.834, Start Cell: 05
    Chapter: 06, Length: 00:12:26.600, Start Cell: 06
    Chapter: 07, Length: 00:16:20.766, Start Cell: 07
    Chapter: 08, Length: 00:10:31.934, Start Cell: 09
    Chapter: 09, Length: 00:09:24.033, Start Cell: 10
    Chapter: 10, Length: 00:09:04.767, Start Cell: 11
    Chapter: 11, Length: 00:00:00.800, Start Cell: 12
    Longest track: 02
    What title number do you want to create chapter info for: 2 
    Chapter 1: 00:00:00.000
    Chapter 2: 00:10:23.200
    Chapter 3: 00:22:16.400
    Chapter 4: 00:30:18.767
    Chapter 5: 00:41:47.300
    Chapter 6: 00:54:43.134
    Chapter 7: 01:07:09.734
    Chapter 8: 01:23:30.500
    Chapter 9: 01:34:02.434
    Chapter 10: 01:43:26.467
    Chapter 11: 01:52:31.234 
    Creating chapter data file....DONE.
    Chapter data file: whiteglasses_chapters.txt

然后我简单地运行:

mkvmerge --chapters chapters.txt -o output.mkv input-file.mkv

【讨论】:

以上是关于如何获取 DVD 中的标题和章节信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取电影的 DVD 发行日期? [关闭]

如何从python中的整数列中获取前4位数字

linux系统上获取命令的帮助信息以及man文档的章节是如何划分的

Java 中的不可达语句

如何从 NextJS / ReactJS 中的 JWT cookie 获取用户信息

如何读一篇论文