使用 gstreamer 从 DVD 中重新混合单个标题而无需重新编码

问题描述 投票:0回答:0

我正在尝试将特定标题的视频从 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 时具有有效的时间戳?

gstreamer video-processing video-encoding gstreamer-1.0
© www.soinside.com 2019 - 2024. All rights reserved.