1

我正在尝试在 gstreamer 中构建流应用程序,它 a)从实时源捕获音频和视频 b)将其编码为 h264 和 aac,c)将其保存在 file.mp4

我正在使用以下管道在文件中记录:

gst-launch-1.0 -e --gst-debug=**:4 videotestsrc is-live=true \
! queue ! videoconvert \
! videorate silent=false \
! videoscale \
! "video/x-raw, width=1280, height=720, framerate=25/1" \
! queue ! x264enc speed-preset=3 tune=zerolatency bitrate=3800 key-int-max=0 \
! queue ! muxer.video_0 \
audiotestsrc is-live=true \
! audioconvert ! audioresample ! audiorate ! "audio/x-raw, rate=48000, channels=2" \
! queue ! faac bitrate=128000 rate-control=2 \
! queue ! muxer.audio_0 \
mp4mux name=muxer streamable=true \
! queue ! filesink location="/home/myenc/mystream.mp4" sync=false

问/问题:

如果我们在短时间约 1-2 小时左右运行给定管道,似乎没有问题。但是当我们运行一段时间后,录制文件会损坏大约 4GB 的文件(等于物理 RAM!?)例如:如果我们捕获 360p 1Mbit 那么文件可以播放到 4 小时,如果我们捕获 720p 4Mbit 然后文件可播放至 1 小时。

有没有人遇到过同样的问题,或者有人可以重现它?

这是 qt/mp4mux 的正常行为,例如这里提到的“ensonic”吗?

有解决方法吗?

经过大量测试后,我假设它与物理内存以及 mp4mux 的工作原理有关。然而,从机器上放置和/或移除额外的 RAM 对损坏的文件没有任何影响(仍然只能播放到 4GB)

任何建议,例如,指向正确的方向,将不胜感激。

笔记:

- 我能够生成的 4GB 后唯一可播放的录音文件是当我们根本不使用任何复用器时(又名 byte-stream=true filename.h264)

- 或者我们使用 mpegtsmux,它不使用内存中的索引表

我尝试了什么:

  • 使用额外的队列并将其放在元素之前/之后

  • 在队列中使用泄漏属性

  • 使用不同的音频/视频源(decklinksrc、videotestsrc、audiotestsrc)

  • 仅捕获视频,不捕获音频

  • 使用不同的音频编解码器 (mp3)

  • 使用 qtmux|mp4mux

  • mp4mux:尝试streamable=true,尝试faststart=true,尝试segmented=2000

  • 使用 x264enc 的 tune=zerolatency 属性

  • 使用 theoraenc+oggenc+oggmux 与 x264enc+faac

  • 在具有相同硬件的两台不同机器上测试

信息:

操作系统:Ubuntu 14.04

Gstreamer:1.4.5(也用 1.3.90 测试过)

处理:i5-3570 @ 3.4Ghz

内存:4GB(也测试了 2GB、8GB)

4

1 回答 1

2

这个问题最初由 gstreamer-devel 邮件列表回答,谢谢)->链接

摘要:
gstreamer 'qtmux'(mp4mux) 中存在一个错误,该错误会生成 4GB 后无法播放的文件。在 1.4.5 中手动应用补丁后,我的问题得到了解决。

-错误描述:https
://bugzilla.gnome.org/show_bug.cgi?id=741279 -补丁 提交:http ://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=2505e343b1cb29541e60afa3418c21b08ded3981

于 2015-06-09T12:46:01.340 回答