国语视界

 找回密码
 立即注册
查看: 7074|回复: 20

[蓝光技术] 请问如何获得音轨的timeshift和字幕的fps信息?

[复制链接]

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
发表于 19-11-8 21:52 | 显示全部楼层 |阅读模式
我想制作一个批量自动提取chinese音轨和字幕的python脚本,核心是调用tsMuxeR命令行工具进行demux(GUI版本制作批量处理工具比较困难)。现在遇到的问题是给tsMuxeR命令行工具制作.meta文件时,发现有的音轨具有timeshift参数,有的字幕具有fps参数(GUI版本中可以自动分析得到),但tsMuxeR命令行获得的信息中没有包含这些必要参数。因此来版上请教大家,应该如何获取音轨和字幕的这些参数?

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-8 22:16 | 显示全部楼层
tsMuxeR和tsMuxeR gui都是开源的,你如果不懂c我可以帮你看看
回复 支持 反对

使用道具 举报

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-8 22:29 | 显示全部楼层
  1. QString TsMuxerWindow::getAudioMetaInfo(QtvCodecInfo* codecInfo)
  2. {
  3.   QString rezStr = codecInfo->programName + ", ";
  4.     rezStr += getFileList(codecInfo);
  5.   if (codecInfo->delay != 0)
  6.     rezStr += QString(", timeshift=") + QString::number(codecInfo->delay) + "ms";
  7.   if (codecInfo->dtsDownconvert && codecInfo->programName == "A_DTS")
  8.     rezStr += ", down-to-dts";
  9.   else if (codecInfo->dtsDownconvert && codecInfo->programName == "A_AC3")
  10.     rezStr += ", down-to-ac3";
  11.     if (codecInfo->isSecondary)
  12.         rezStr += ", secondary";
  13.   return rezStr;
  14. }
复制代码
回复 支持 反对

使用道具 举报

13

主题

918

帖子

1313

积分

论坛大神

大洋
20751
阅读权限
130
发表于 19-11-8 23:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-9 22:04 | 显示全部楼层
世界哪有真情lu 发表于 19-11-8 23:45
tsMuxeR 源码~~
https://github.com/justdan96/tsMuxer

感谢二位大佬,原来tsMuxeR仍然有人在维护。由于我的工作完全与软件开发和多媒体编程无关,我先试试最新版的tsMuxeR,如果命令行版本已经可以输出完整信息,那问题就已经得到了解决。有新情况我再来版上汇报进展。
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-9 23:01 | 显示全部楼层
本帖最后由 yellowolf 于 19-11-9 23:03 编辑


非常感谢大佬。
我从事的工作(电气工程),与软件开发和多媒体编程相差比较远,我也就是能用python边百度边写,弄点傻瓜化的程序,从源码级别修改完善eac3to和txMuxeR很困难。
您提示的这段程序代码上我能看懂,但我的具体困难可能是如何获得codecInfo,而且至少是从.m2ts文件、最好是从.mpls文件获得(因为有很多资源是由多个m2ts组成的所谓肉酱盘)。为了说清楚问题,我还是向大大完整汇报一下来龙去脉,请大大指导解决方案。
为了实现批量提取国语音轨和字幕的目标,我先后尝试了eac3to和tsMuxeR两个方案。
eac3to的问题是:
1、经测试,eac3to 3.34不支持含5.1 core的7.1 E-AC3,只能使用-core参数。
2、更麻烦的是,有些资源提取出来的音频被发现与视频不同步。似乎是eac3to发现了音频流中存在gap而引入2nd pass时就会出现(不充分测试)。
tsMuexR的问题是:
1、命令行版本需要编写.meta文件,但是,只有使用GUI版本才能自动生成所需参数。如资源Toy.Story.4.2019.ULTRAHD.Blu-ray.2160p.HEVC.TrueHD.Atmos.7.1-xxx(55.6 GB,纯研究,为了避免引起发布组不快此处隐去名称),GUI版本可以得到最后一条音轨的timeshift参数,
A_AC3, "F:\_Hashed\_UHD\Toy.Story.4.2019.ULTRAHD.Blu-ray.2160p.HEVC.TrueHD.Atmos.7.1-xxx\BDMV\PLAYLIST\00004.mpls", timeshift=300ms, track=4358, lang=zho。然而这个参数在命令行版本的分析结果中却根本没有,因此无法独立于GUI版本进行自动化输出。
2、不能正确parser部分资源(包括上述案例)的.mpls文件,一处理便报错。经观察似乎是把部分m2ts文件名识别成了乱码。
3、由于tsMuexR的批量处理尚未实现,可能还有其他问题。
由于我有约300个原盘需要处理,我很需要一个能全面处理各种格式、可靠输出结果的程序。我打算两个软件都调用,对它们的处理结果进行自动化比较,当发现明显差异时提示我。这是后话了,目前的关键是如何用tsMuxeR命令行版本进行demux。
回复 支持 反对

使用道具 举报

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-10 09:08 | 显示全部楼层
本帖最后由 bobo 于 19-11-10 12:19 编辑

看了下ts gui的代码,是用qt5写的,95%的代码是用来做人机交互的。真正实现处理工作的代码非常简单,调用tsmuxer程序加文件名,获得侍处理文件的回显示信息并格式化,其中有一项叫Stream delay: 就是你要的。
回复 支持 反对

使用道具 举报

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-10 09:42 | 显示全部楼层
简单测试了下,可以正常获取延迟信息,看下图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-10 13:17 | 显示全部楼层
本帖最后由 yellowolf 于 19-11-10 13:22 编辑
bobo 发表于 19-11-10 09:42
简单测试了下,可以正常获取延迟信息,看下图


非常感谢。是我检查得不够仔细,时延参数可以在命令行界面中找到。现在还有一个问题,tsMuxeR不能正常解析一部分.mpls文件。执行命令"tsMuxeR.exe" "F:\_Hashed\_UHD\Toy.Story.4.2019.ULTRAHD.Blu-ray.2160p.HEVC.TrueHD.Atmos.7.1-xxx\BDMV\PLAYLIST\00004.mpls",解析结果在此处终止:



在.meta中指定这条mpls,tsmuxer在demux一开始就会报告无法解析的错误。
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-10 13:19 | 显示全部楼层
本帖最后由 yellowolf 于 19-11-10 13:31 编辑

txmuxer的GUI版本也无法解析这个资源的“所有”.mpls文件,任意一条.mpls解析结果如下:



demux就会报错:



每一条.mpls文件都有这样的问题。但是,在bdinfo和python程序中却都是可以正常解析的。bdinfo的解析结果如下:



回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-10 13:49 | 显示全部楼层
bobo 发表于 19-11-10 09:08
看了下ts gui的代码,是用qt5写的,95%的代码是用来做人机交互的。真正实现处理工作的代码非常简单,调用ts ...

大大,我试了一下,单独的mpls文件发上来没用,必须结合.m2ts才能测试。
我把tsmuxer的代码下载回来了,打算调试看看解析的BUG出在哪里,也想评估一下解决.mpls解析bug的难度。
那么很圡的问题来了,请问应该用什么IDE比较好?我目前只会用pycharm这类轻量级工具作调试。
回复 支持 反对

使用道具 举报

13

主题

1748

帖子

7026

积分

旅长

大洋
15954
阅读权限
70

灌水之王

发表于 19-11-10 14:51 | 显示全部楼层
你是拿DIY过的盘测试,还是未DIY的?
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-10 15:40 | 显示全部楼层
hyb9373 发表于 19-11-10 14:51
你是拿DIY过的盘测试,还是未DIY的?

回大大,是我自己从一些PT站搜集的DIY原盘。
回复 支持 反对

使用道具 举报

9

主题

492

帖子

562

积分

连长

大洋
2991
阅读权限
40
发表于 19-11-11 09:57 | 显示全部楼层
hyb9373 发表于 19-11-10 14:51
你是拿DIY过的盘测试,还是未DIY的?

DIY的盘一样可以扫描读取,不能读,那发布的作品字幕音轨信息哪来。所以跟DIY与否无关
回复 支持 反对

使用道具 举报

13

主题

1748

帖子

7026

积分

旅长

大洋
15954
阅读权限
70

灌水之王

发表于 19-11-11 12:46 | 显示全部楼层
jack_son 发表于 19-11-11 09:57
DIY的盘一样可以扫描读取,不能读,那发布的作品字幕音轨信息哪来。所以跟DIY与否无关 ...

你看他ts有张图有乱码,00055m2ts后面应该是00057,然而不是,我没有这个原盘,也没有DIY过的,所以无法确认是否是DIY原因造成的
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-11 20:16 | 显示全部楼层
本帖最后由 yellowolf 于 19-11-11 20:33 编辑

为了调试这个问题,我安装了qt-creator、cmake、MIinGW-w64。在搭建的这个环境里,简单的cpp可以编译成功。但是编译tsmuxer时却在最后连接时报告错误:
19:39:46: Running steps for project tsmuxer...
19:39:47: Starting: "C:\Program Files\CMake\bin\cmake.exe" --build . --target all
jom: parallel job execution disabled for Makefile
[ 1%] Linking CXX executable tsmuxer.exe
D:/Software/mingw64(posix)/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lmediation
collect2.exe: error: ld returned 1 exit status
jom: D:\Software (x86)\_Encode\tsMuxer-master\build-tsMuxer-test111-Debug\CMakeFiles\tsmuxer.dir\build.make [tsmuxer.exe] Error 1
jom: D:\Software (x86)\_Encode\tsMuxer-master\build-tsMuxer-test111-Debug\CMakeFiles\Makefile2 [CMakeFiles\tsmuxer.dir\all] Error 2
jom: D:\Software (x86)\_Encode\tsMuxer-master\build-tsMuxer-test111-Debug\Makefile [all] Error 2
19:39:55: The process "C:\Program Files\CMake\bin\cmake.exe" exited with code 2.
Error while building/deploying project tsmuxer (kit: test111)
When executing step "CMake Build"
19:39:55: Elapsed time: 00:09.
谷歌了很久,似乎是缺少库libmediation。注意到项目目录下有个同名文件夹,我把它编译了,生成的有用文件似乎是libmediation.a。另外,我还在工程设置中勾上了依赖项:


但是还是会报告这个找不到库的错误。请问如何把这个库包含进去?
回复 支持 反对

使用道具 举报

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-11 22:02 | 显示全部楼层
本帖最后由 bobo 于 19-11-11 22:32 编辑



图上面的libmediation目录,先用cmake编译,此时目录下会生成makefile文件,完成后使用命今make install安装你编译文件,如果不行查看用户变量PATH ,并手动复制到相关目录。

另外看你的截图好像mpls有问题。



看文件名是乱码啊,ts中断因该是ts不支持这种编码方式。你可以在其它原盘或不同的mpls测试下。

最后,你如果能看懂c,就不用编译调试了,如果你看不懂就算编译完,你还是不懂。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

9

主题

492

帖子

562

积分

连长

大洋
2991
阅读权限
40
发表于 19-11-12 16:22 | 显示全部楼层
波波大威武,啥语言都懂,膜拜
回复 支持 反对

使用道具 举报

18

主题

104

帖子

33

积分

列兵

大洋
279
阅读权限
10
 楼主| 发表于 19-11-12 19:26 | 显示全部楼层
bobo 发表于 19-11-11 22:02
图上面的libmediation目录,先用cmake编译,此时目录下会生成makefile文件,完成后使用命今make install ...


谢谢波波大。多谢您的提醒,我确定自己慢慢看C是看得懂的。如果有具体的问题,我就厚着脸皮到版上来请教。
mpls文件应该没有问题,原盘可以正常播放,然后github上的这个库:
https://github.com/Guymer/PyGuymer
也能正常解析mpls中的所有信息,每个mpls都能列出所有相关的m2ts文件列表。
我是在windows下面调试,您说的make install暂时不能用。
我现在离开始调试只差一步了:目前可以通过手动复制这个自编库的文件然后在命令行下编译连接成功了,不过有个条件,只能对库和tsmuxer分别编译,就是必须分别使用它们各自的CMakeLists.txt文件编译。如果使用项目master根目录下的CMakeLists.txt联合编译,则会报告如下错误:
  1. E:\Code\cpp\tsMuxer-master2\tsMuxer\textSubtitlesRender.cpp:217:17: warning: overflow in conversion from 'std::__cxx11::basic_string<char>::size_type' {aka 'long long unsigned int'} to 'int' changes value from '18446744073709551615' to '-1' [-Woverflow]
  2.   return string::npos;
  3.                  ^~~~
  4. [ 85%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/tsDemuxer.cpp.obj
  5. [ 86%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/tsMuxer.cpp.obj
  6. [ 88%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/tsPacket.cpp.obj
  7. [ 90%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/utf8Converter.cpp.obj
  8. [ 91%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/vc1Parser.cpp.obj
  9. [ 93%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/vc1StreamReader.cpp.obj
  10. [ 95%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/vod_common.cpp.obj
  11. [ 96%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/wave.cpp.obj
  12. [ 98%] Building CXX object tsMuxer/CMakeFiles/tsmuxer.dir/osdep/textSubtitlesRenderWin32.cpp.obj
  13. [100%] Linking CXX executable tsmuxer.exe
  14. CMakeFiles\tsmuxer.dir/objects.a(matroskaDemuxer.cpp.obj):matroskaDemuxer.cpp:(.text+0x17c0): undefined reference to `inflateInit_'
  15. CMakeFiles\tsmuxer.dir/objects.a(matroskaDemuxer.cpp.obj):matroskaDemuxer.cpp:(.text+0x1852): undefined reference to `inflate'
  16. CMakeFiles\tsmuxer.dir/objects.a(matroskaDemuxer.cpp.obj):matroskaDemuxer.cpp:(.text+0x188a): undefined reference to `inflateEnd'
  17. collect2.exe: error: ld returned 1 exit status
  18. make[2]: *** [tsMuxer\CMakeFiles\tsmuxer.dir\build.make:935: tsMuxer/tsmuxer.exe] Error 1
  19. make[1]: *** [CMakeFiles\Makefile2:144: tsMuxer/CMakeFiles/tsmuxer.dir/all] Error 2
  20. make: *** [Makefile:129: all] Error 2
复制代码


CMakeLists.txt文件内容:
  1. cmake_minimum_required (VERSION 3.1)
  2. project (tsmuxer_main)

  3. set(CMAKE_CXX_STANDARD 11)
  4. set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
  5. set(CMAKE_CXX_EXTENSIONS FALSE)

  6. if (WIN32)
  7.   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32")
  8. else()
  9.   if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  10.     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAC")
  11.   else()
  12.     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLINUX")
  13.   endif()
  14. endif()

  15. add_subdirectory (libmediation)
  16. add_subdirectory (tsMuxer)
  17. if(TSMUXER_GUI)
  18.         add_subdirectory (tsMuxerGUI)
  19. endif()
复制代码


谷歌了一圈,好像是zlib.h的问题。求指点
回复 支持 反对

使用道具 举报

156

主题

339

帖子

5597

积分

超级版主

大洋
414064
阅读权限
150

太空探索计划

发表于 19-11-12 21:57 | 显示全部楼层
https://github.com/filler56789/RV-tsMuxeR
这里有个zlib库你可试试编译它
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表