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

Ffmpeg 如何在DVD中获取标题和章节信息?,ffmpeg,libavcodec,libav,libavformat,Ffmpeg,Libavcodec,Libav,Libavformat,我发现了许多关于使用ffmpeg创建DVD菜单的问题,但我没有发现任何关于通过编程访问DVD结构信息的问题。当我使用libav(或FFmpeg)库时,我可以打开DVD图像(iso文件)并访问视频、音频和字幕流。但是我找不到任何API 我可以使用VLC播放器(以及libvlc库)播放视频并查找信息。但我需要对音频和字幕流进行编程处理。我不想使用SmartRipper之类的工具分割VOB,然后再进行处理 libav(ffmpeg)是否包含处理DVD菜单的API?如果没有,您能否推荐任何其他库,用于以

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

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

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

我听说了libdvdnav图书馆,但我不知道它是否适合我。
我不熟悉libav和DVD格式的内部结构。

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

mplayer dvd://-识别
结果

CHAPTERS: 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, 章节: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, 基本上你不知道,但你可以寻找最长的标题

一个选项:使用手制动器CLI-扫描e:(手制动器的一部分)

另一个:使用
mplayer-识别dvd://-dvd设备e:
(mplayer (标准)

发件人:

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

基本上,安装VLC媒体播放器,然后在其中播放DVD。 导航至“播放真正的标题”

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

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


来源:

我不确定在这种情况下1帧精度意味着什么。然而,我一直在使用一个名为的工具,这是一个基本的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
的源代码会很有帮助。它在Fedora25中链接到的唯一库(标准素材除外)是
libdvdread.so.4
,它是该项目的一部分


HTH.

我使用上述两种方法的组合创建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"
然后我就跑:

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

尝试在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格式并在第一个视频结束时,它将继续下一个视频,而不显示任何消息。我添加了
-frames 0
选项以防止实际播放视频。示例:
mplayer-identification-frames 0'/path/to/VIDEO_TS.IFO 2>/dev/null | grep CHAPTERS:
或者,您可以使用
grep TITLE
标题进行筛选,标题似乎每行一个。请注意,您可以使用
lsdvd-c
显示有关章节的详细信息。
mkvmerge --chapters chapters.txt -o output.mkv input-file.mkv