我正在尝试将特定标题的视频从 DVD 重新混合到视频文件中,而不解码然后重新编码视频。
我有这个管道完全按照我想要的音频方式工作,理论上也可以按照我想要的视频方式工作,但是由于以下原因丢弃了大多数视频缓冲区
matroskamux matroska-mux.c:4035:gst_matroska_mux_write_data:<mux:video_0>
Invalid buffer timestamp; dropping buffer
生成的视频文件播放,但是是幻灯片放映,正如人们所期望的那样,考虑到所有丢弃的视频缓冲区。
这是有问题的管道
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux \
\
multiqueue name=queue \
demux. ! 'video/mpeg' ! queue. \
demux. ! 'audio/x-private1-ac3' ! queue. \
\
matroskamux name=mux \
queue. ! mpegvideoparse ! mux. \
queue. ! ac3parse ! mux. \
\
mux. ! filesink location=~/test.mkv
这是我尝试注入时间戳的同一管道的另一个版本,它也不起作用。
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc do-timestamp=true ! title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux ignore-scr=true \
\
multiqueue name=queue \
demux. ! 'video/mpeg' ! queue. \
demux. ! 'audio/x-private1-ac3' ! queue. \
\
matroskamux name=mux \
queue. ! mpegvideoparse disable-passthrough=true ! mux. \
queue. ! ac3parse disable-passthrough=true ! mux. \
\
mux. ! filesink location=~/test.mkv
认为多队列或同步视频和音频可能有问题,我仍然可以通过删除管道的音频组件并从多队列切换到队列(不是 queue2,那在管道结束之前结束管道,除了推测错误外我不知道为什么)。
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=1 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux \
\
queue name=videoqueue \
demux. ! 'video/mpeg' ! videoqueue. \
\
matroskamux name=mux \
videoqueue. ! mpegvideoparse ! mux. \
\
mux. ! filesink location=~/test.mkv
既然我推测 queue2 中存在错误,那么如果我完全删除队列怎么办?还是有问题
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=1 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux \
! mpegvideoparse \
! matroskamux \
! filesink location=~/test.mkv
重要的一点是我可以play视频JUST FINE与gstreamer,例如
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux \
! mpegvideoparse \
! mpeg2dec \
! autovideosink
与工作音频和视频相同
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux \
\
multiqueue name=queue \
demux. ! 'video/mpeg' ! queue. \
demux. ! 'audio/x-private1-ac3' ! queue. \
\
queue. ! mpegvideoparse ! mpeg2dec ! autovideosink \
queue. ! ac3parse ! a52dec ! autoaudiosink
所以这不是源视频不好的问题,这完全是管道中缺少的东西。
我什至可以一边播放视频一边重新混合,屏幕上的视频很流畅,但保存到磁盘的文件却断断续续
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux \
\
tee name=vtee \
tee name=atee \
demux. ! mpegvideoparse ! vtee. \
demux. ! ac3parse ! atee. \
\
multiqueue name=playqueue \
multiqueue name=convqueue \
vtee. !playque ue. \
vtee. ! convqueue. \
atee. ! playqueue. \
atee. ! convqueue. \
\
playqueue. ! decodebin ! autovideosink \
playqueue. ! decodebin ! autoaudiosink \
\
matroskamux name=mux \
convqueue. ! mux. \
convqueue. ! mux. \
\
mux. ! filesink location=~/test.mkv
这里是解码 mpeg 视频然后重新编码 mpeg 视频的管道版本。此版本生成的视频文件不是幻灯片,但存在需要重新编码视频的问题。我不想重新编码视频,我想“按原样”使用它。
#!/bin/bash
TITLE=2
DVD=~/BATTSTAR_GALAC_S1_D2.iso
GST_DEBUG=2 \
gst-launch-1.0 -v -e \
dvdreadsrc title=${TITLE} device=${DVD} \
! mpegpsdemux name=demux \
\
multiqueue name=queue \
demux. ! 'video/mpeg' ! queue. \
demux. ! 'audio/x-private1-ac3' ! queue. \
\
matroskamux name=mux \
queue. ! mpegvideoparse ! mpeg2dec ! mpeg2enc ! mux. \
queue. ! ac3parse ! mux. \
\
mux. ! filesink location=~/test.mkv
请注意,我使用的是 gstreamer 版本 1.20.4,在 Gentoo Linux 上编译和安装。 1.22 版本系列可能修复了我的问题,但我在发行说明上没有看到任何让我认为这已得到解决的内容:https://gstreamer.freedesktop.org/releases/1.22/
那么我的管道中缺少什么来阻止从 DVD 读取的缓冲区在到达 matroskamux 时具有有效的时间戳?