gpt4 book ai didi

audio - 使用Gstreamer在录制音频+视频的同时显示无音频视频

转载 作者:行者123 更新时间:2023-12-02 09:03:01 26 4
gpt4 key购买 nike

我的 Logitech C920 网络摄像头提供以 h264 编码的视频流。我正在使用this "capture" tool访问数据:

这样我就可以观看实时视频:

/usr/local/bin/capture -d /dev/video0 -c 100000 -o | \
gst-launch-1.0 -e filesrc location=/dev/fd/0 \
! h264parse \
! decodebin\
! xvimagesink sync=false

...或将流录制为原始 h264 文件:

/usr/local/bin/capture -d /dev/video0 -c 100000 -o | \
gst-launch-0.10 -e filesrc location=/dev/fd/0 \
! h264parse \
! mp4mux \
! filesink location=/tmp/video.mp4

...但我一生都无法弄清楚如何同时做到这两点。录制时在屏幕上实时显示有时会很有用,所以我想让这项工作成功。花了好几个小时寻找一种同时抓取和屏幕显示的方法,但没有成功。再多的乱搞 teequeue 也无济于事。

我想将 ALSA 音频(hw:2,0)也加入其中会是一个额外的好处,但我可以用一种丑陋的 hacky 方式来解决这个问题。现在,即使 hw:2,0 是 Audacitu 或 arecord 中的有效输入,我也得到这个,例如:

Recording open error on device 'hw:2,0': No such file or directory
Recording open error on device 'plughw:2,0': No such file or directory

回顾一下:很想将这两个视频片段放在一起,如果音频也能工作的话,那就太好了。我感觉自己像个新手。

预先感谢您提供的任何帮助。

编辑:非工作代码:

/usr/local/bin/capture -d /dev/video1 -c 100000 -o | \
gst-launch-1.0 -e filesrc location=/dev/fd/0 ! tee name=myvid ! h264parse ! decodebin \
! xvimagesink sync=false myvid. ! queue ! mux. alsasrc device=plughw:2,0 ! \
audio/x-raw,rate=44100,channels=1,depth=24 ! audioconvert ! queue ! mux. mp4mux \
name=mux ! filesink location=/tmp/out.mp4

...导致此:

WARNING: erroneous pipeline: could not link queue1 to mux 

编辑:尝试了 umlaeute 的建议,得到了一个几乎空的视频文件和一个卡住的实时视频帧。修复了启用音频的代码中的两个小错误(双引号拼写错误,未将音频编码为与 MP4 兼容的任何内容)后,有/没有音频没有区别。在 audioconvert 之后添加 avenc_aac > 做到了这一点)。错误输出:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstAudioSrcClock
Redistribute latency...
ERROR: from element /GstPipeline:pipeline0/GstMP4Mux:mux: Could not multiplex stream.
Additional debug info:
gstqtmux.c(2530): gst_qt_mux_add_buffer (): /GstPipeline:pipeline0/GstMP4Mux:mux:
DTS method failed to re-order timestamps.
EOS on shutdown enabled -- waiting for EOS after Error
Waiting for EOS...
ERROR: from element /GstPipeline:pipeline0/GstFileSrc:filesrc0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2809): gst_base_src_loop (): /GstPipeline:pipeline0/GstFileSrc:filesrc0:
streaming task paused, reason error (-5)

编辑:好的,umlaeute 的更正代码可以完美运行,但前提是我使用 v4l2src 而不是转换工具。目前,这意味着抓取 MJPEG 流而不是 H264 流。尽管我想我更喜欢更现代的工作流程,但我的 Nose 没有皮肤脱落。不管怎样,这就是实际的工作原理,输出一个 MJPEG 视频文件和一个实时“取景器”。虽然不是完美优雅,但非常实用。感谢您的帮助!

gst-launch-1.0 -e v4l2src device=/dev/video1 ! videorate ! 'image/jpeg, width=1280, height=720, framerate=24/1' ! tee name=myvid \    
! queue ! decodebin ! xvimagesink sync=false \
myvid. ! queue ! mux.video_0 \
alsasrc device="plughw:2,0" ! "audio/x-raw,rate=44100,channels=1,depth=24" ! audioconvert ! lamemp3enc ! queue ! mux.audio_0 \
avimux name=mux ! filesink location=/tmp/out.avi

最佳答案

gstreamer 在自动组合多个不同流时通常有点愚蠢(例如使用 mp4mux)。在这种情况下,您通常不仅应该将流发送到命名元素,还应该发送到特定的 pad(使用 elementname.padname 表示法;element. 表示法实际上只是命名元素中“任何”pad 的简写)。

另外,您似乎忘记了 mp4muxer 的 h264parse (如果您查看视频所采用的路径,它实际上可以归结为 filesrc !queue !mp4mux这可能有点粗糙)。

虽然我无法测试管道,但我想像下面这样的东西应该可以解决问题:

 /usr/local/bin/capture -d /dev/video1 -c 100000 -o | \
gst-launch-1.0 -e filesrc location=/dev/fd/0 ! h264parse ! tee name=myvid \
! queue ! decodebin ! xvimagesink sync=false \
myvid. ! queue ! mp4mux ! filesink location=/tmp/out.mp4

对于音频,它可能更复杂,尝试这样的方法(显然假设您可以使用alsasrc device="plughw:2,0"元素读取音频)

 /usr/local/bin/capture -d /dev/video1 -c 100000 -o | \
gst-launch-1.0 -e filesrc location=/dev/fd/0 ! h264parse ! tee name=myvid \
! queue ! decodebin ! xvimagesink sync=false \
myvid. ! queue ! mux.video_0 \
alsasrc device="plughw:2,0" ! "audio/x-raw,rate=44100,channels=1,depth=24"" ! audioconvert ! queue ! mux.audio_0 \
mp4mux name=mux ! filesink location=/tmp/out.mp4

关于audio - 使用Gstreamer在录制音频+视频的同时显示无音频视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16037840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com