【发布时间】:2019-08-31 23:03:30
【问题描述】:
我正在尝试从 USB 摄像头录制视频,使用 GStreamer 对其进行编码和保存。每 20 秒我想停止视频,更改输出名称并重新开始捕获/编码。
我将发布我的代码的简化版本,因为它很长而且无关紧要。
其他细节:
timer 跟踪经过的时间(以秒为单位)。
create_pip(j) 构建以下 gst 管道并将 j 附加到文件名(如 test_rgb_0.mp4、test_rgb_1.mp4 等)
"v4l2src ! video/x-raw, width=1280, height=720, framerate=30/1, format=RGB ! videoconvert ! omxh265enc bitrate=2000000 qp-range=35,51:35,51:-1,-1 vbv-size=1 iframeinterval=60 ! matroskamux ! filesink location=test_rgb.mp4 -e"
// declarations and stuff
// this for is just to have 3 different video files
for(int j=0; j<3; j++){
// create pipeline
pipeline = gst_parse_launch(create_pip(j).c_str(),NULL);
gst_element_set_state(pipeline,GST_STATE_PLAYING);
timer.reset(); // reset timer to 0
while(timer.elapsed()<=20){
// do some other stuff, can be ignored
}
// stop stream and release pipeline
gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(pipeline);
}
一切正常,输出视频时长为 20 秒,但 vlc(或 mediainfo)显示视频时长为 0 或 1 秒。如果我打开视频,它实际上是 20 秒长,所以剩余时间为负数(-19 或 -20 秒)。由于我创建的管道在命令行上运行良好,我认为我的程序在关闭流时无法保存一些元数据。抱歉,我对 Gstreamer 还很陌生,我错过了什么?
【问题讨论】:
-
好吧,既然多路复用器不知道你将不会开始一个新文件,一些元数据可能会丢失。有什么理由不想改用
multifilesink? -
或者
splitmuxsink甚至.. -
@FlorianZwoch 我很笨,我完全忘记了
multifilesink的存在。我刚刚尝试用它建立一个新的管道,但我仍然遇到同样的问题。这是我使用的管道:"v4l2src ! video/x-raw, width=1280, height=720, framerate=30/1, format=RGB ! videoconvert ! omxh265enc bitrate=2000000 qp-range=35,51:35,51:-1,-1 vbv-size=1 iframeinterval=60 ! matroskamux ! multifilesink next-file=5 max-file-duration=20000000000 location=test_rgb_%02d.mp4 -e" -
我忘了提,即使我使用
gst-launch-1.0 v4l2src ! video/x-raw, width=1280, height=720, framerate=30/1, format=RGB ! videoconvert ! omxh265enc bitrate=2000000 qp-range=35,51:35,51:-1,-1 vbv-size=1 iframeinterval=60 ! matroskamux ! multifilesink next-file=5 max-file-duration=20000000000 location=test_rgb_%02d.mp4 -e从命令行启动管道,我也会遇到同样的问题。splitmuxsink似乎没有链接到 h265enc,但如果我将编码器更改为 h264 并生成 20 秒长的视频,它就可以工作