This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:记录文件时立即启用 AM5728 GStreamer EOS

Guru**** 2546960 points
Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/735926/linux-am5728-am5728-gstreamer-eos-immediately-when-recording-file

器件型号:AM5728

工具/软件:Linux

我在 AM5728 EVM 上使用的是最新的 TI Process SDK 05.00.00.15以及 Linux 内核4.14.40和 GStreamer 1.12.2版。 我正在使用 GStreamer 创建3条管线。 这3条管道中的2条从2个 V4L2摄像机捕获、并将摄像机数据文件链接到2个 Linux 命名管道。 第3个管道从这2个命名管道中的每个管道读取并将流编码为 Matrosska 文件。 2个流中的1个采用 Huffman 编码、1个采用 H264编码。

这些管道使用以下脚本构建:

#!/bin/sh

killall gst-launch-1.0 2>/dev/null

rm -rf /tmp/test-h264-test.mkv /tmp/vl-gstreamer-pipe /tmp/ir-gstreamer-pipe

gst-launch-1.0 -v -e v4l2src device=/dev/video2 io-mode=4! 'video/x-raw、format=(string) UYVY、width=(int) 160、height=(int) 120、framerate=9/1'! 视频转换! 'video/x-raw、format=(string) NV12、width=(int) 160、height=(int) 120'! filesink buffer-mode=nbuffer buffer-size=0 location=/tmp/ir-gstreamer-pipe sync-true &

gs-launch-1.0 -v -e v4l2src device=/dev/video1! 'video/x-raw、format=(string) YUY2、width=(int) 640、height=(int) 480、framerate=30/1'! 视频转换! 'video/x-raw、format=(string) NV12、width=(int) 640、height=(int) 480'! filesink buffer-mode=nbuffered buffer-size=0 location=/tmp/vl-gstreamer-pipe sync-true &

for I in {1..15}
请
执行回显“正在等待... $I"
睡眠1


完成睡眠3

GST-LAUNCH-1.0 -v -e 文件 rc 位置=/tmp/ir-gstreamer-pipe do-timestime=true blocksize=28800! 视频粗宽度=160高度=120帧速率=9格式=nv12! 'video/x-raw、format=(string) NV12、width=(int) 160、height=(int) 120、framerate=9/1'! 视频转换! 'video/x-raw、format=(string) BGRA、width=(int) 160、height=(int) 120、framerate=9/1'! 天堂! 排队! 多路复用。 filesrc location=/tmp/vl-gstreamer-pipe blocksize=460800 DO 时间戳=true! 视频粗宽度=640高度=480帧速率=30格式=nv12! 排队! 'video/x-raw、format=(string) NV12、width=(int) 640、height=(int) 480、framerate=30/1'! ducatih264enc! 排队! 'VIDEO/x-h264、宽=640、高=480'! h264parse! 排队! 多路复用。 matroskamux name=mux Min-index-interval=1000000000! 排队! filesink buffer-mode=nbuffer buffer-size=0 location=/tmp/test-h264-test.mkv sync-true

for I in {1..20}
do
ls -lRT /tmp | egrep "gstream|264"
sleep 1
done

pgrep -f gst-launch | xargs kill -2

多路复用器会在短时间内(仅几秒钟)读取命名管道,然后立即失败。 短文件中包含的数据可以成功地解复用并使用以下命令回放。 多路信号分离流看起来不错、大小不同:

gst-launch-1.0文件 rc location=test-h264-test.mkv! 排队! matroskademux 名称=d d.video_0! 排队! 很棒! 视频转换! 视频装饰! 视频/x-raw、帧速率=9/1! waylandsink sync-false

gst-launch-1.0文件 rc location=test-h264-test.mkv! 排队! matroskademux name=d d.video_1! 排队! h264parse! ducatih264dec! 视频装饰! 视频/x-raw、帧速率=30/1! landwaysink 同步=错误 

以下消息以红色突出显示 EOS:

/GstPipeline0/GstFileSink:filesink0.GstPad:sink:cap = video/x-matroska、streambheader=(buffer)< 1a45dfa3000000000001442896d6174726f736b610042878102458108000000ffffff60080670100538000036bffffffffffffffff100410053800004510046100ffffffffffffffffffffffffffffffffffff100410053800001853100ffffffffffffffffffffffffffffffff100410053100f800001853100ffffffffffffffffffffffffffffffffffffffffffffff1004100410041005310053100ff100f800001853100f8000036b53100ffffffffffffffffffffffffffffffffffffffffffffffffffff100531005310053100f8000036b5310053100ff10053100

在0:00:02.604358548
将管道设置为暂停后结束执行...
正在将管道设置为就绪...
正在将管道设置为 NULL ...
正在释放管道... 

为什么多路复用器管道几乎立即裸片? 我如何才能使它可靠地记录、直到我故意将其杀死?

感谢您的帮助、

Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Phil、您好、

    根据我的理解、当您在同一文件中录制时、您正在尝试将保存的视频文件存档用例播放(打开)。

    以下是一些我希望对您有所帮助的注释。

    1.例如,此类管道将不起作用:

    gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=1280、height=720'! ducatih264enc! h264parse! 文件链接位置=1.h264文件 rc 位置=1.h264! h264parse! 杜拉蒂哈264decvpe! 陆上接收机

    第二个解析器可能会失败并出现错误 No valid frames found before end of stream (在流结束前未找到有效帧)、原因可能是在打开文件时、1.h264 (保存的)视频文件不包含完整帧。

    2.分开管道的示例:

    gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=1280、height=720'! ducatih264enc! h264parse! 真棒! 文件链接位置= rec.mov &

    gst-launch-1.0文件 rc location=rec.mov! qtdemux! h264parse! 杜拉蒂哈264decvpe! 陆上接收机

    在这种情况下、多路解复用器可能会失败、并出现错误:此文件不包含可播放的流。 它希望编码文件中出现 EOS 的可能原因。

    3.类似这样的管道不会完全起作用(与您的用例类似):

    gst-launch-1.0 -e videotestsrc! 'video/x-raw、format=(string) NV12、width=1280、height=720'! ducatih264enc! h264parse! 文件链接位置=rec.264 &

    gst-launch-1.0文件 rc location=rec.264 ! h264parse! 杜拉蒂哈264decvpe! 陆上接收机

    但在这种情况下、解码将在某个时间点退出、因为"filesink"(保存在文件中)比读取它慢。 正如您已经观察到的那样、您将获得 EOS。

    最后一个管道将在一定程度上与某些多路复用器和多路信号分离器元素配合使用。 例如、使用 avimux 和 avidemux 将正常工作、但不符合预期(案例3)。 我想 Matrokamux/Demux 也是如此。 如果是 qtmux/Demux、则情况为2。

    我不确定您的最终用例是什么、但有一个 gstreamer 元素可以提供帮助。

    此元素 称为 TEE。 此元素可帮助您在两个分支中拆分管道,例如同时在文件中捕获->编码->保存和第二个分支捕获->显示。 在这种情况下、您可以在捕获元素之后拆分管道。

    下面是一个简单的示例:

    gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=1000 io-mode=4! '视频/x-raw、\

    format=(string) YUY2、width=(int) 1280、height=(int) 720、帧速率=(fraction) 30/1'! VPE num-input-buffers=8! TEE NAME=t ! \

    排队! ducatimpeg4enc bitrate = 4000! 排队! 太棒了! 真棒! 文件链接位置=x.mp4 t! 排队! kmsink

    请记住、此元素可能会将流水线拆分为 N 个"分支"。 此元素的第二个注意事项是、必须在每个分支中使用队列或多队列来为每个分支提供单独的线程。 否则、一个分支中被阻止的数据流会使其他分支停止。

    您可以在此处查看 TEE 的元件文档:

    希望这对您有所帮助。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Margarita、

    非常感谢您对此的支持。

    要澄清一点、我不想在录制的同时播放。 我将回放命令放在原始问题中、只是为了显示生成的文件是有效的。

    我真正要做的是:

    1. 启动第一个流水线、该流水线仅从 V4L2源捕获、转换为 NV12格式、并将非缓冲写入 Linux 命名管道"A"
    2. 启动第二个流水线、该流水线仅从另一个 V4L2源捕获、转换为 NV12格式、并将非缓冲写入 Linux 命名管道"B"
    3. 启动同时从命名管道"A"和命名管道"B"读取的第三个流水线、并对数据进行编码和多路复用、然后将数据转换到我的输出文件中

    这些管道不涉及回放、问题是第三个管道在启动后几秒钟内消失。 在 Linux 中、我可以看到命名管道中正在填充数据、因为 V4L2摄像头不断向它们倾倒帧、但第三个管道仅从这些管道中读取几秒钟的数据、并对帧进行编码、然后在数据消失之前将帧写入 Matroska 文件。

    我知道它编码正确、因为我可以回放文件中的流并在屏幕上看到良好的图像、但文件太短、以至于回放时间仅为几秒钟。

    我已经将队列放置在第三个流水线中、我可以看到摄像机正在快速生成数据、但似乎第三个流水线正在被盯视。

    如何解决此问题? 谢谢!

    Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!


    只需确认两个捕获管道在您执行第3个右(2个编码)时都没有运行? 我是说捕获已完成、之后您只需打开2个文件进行编码?
    另一件事是、请为两个捕获管道设置 SYNC=false。


    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不、我希望所有3个都同时运行。 我希望生产者(2个 V4L2管道)转储到命名管道 FIFO 中,而使用者(文件多路复用器)在可用时获取数据并阻止其他数据,直到文件中有更多数据。

    Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Phil、您好、

    我想您在第一个答案中输入案例3 (编码->多路复用或解码无关紧要)。
    TEE 元件是否适合您的用例?
    我尚未尝试过此类用例、但您能否查看本教程:
    gstreamer.freedesktop.org/.../pipeline-manipulation.html

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    如果回答了您的问题、请单击"此问题已解决"按钮。
    您可以打开新问题的新主题。
    谢谢!

    BR
    玛格丽塔