使用gstreamer h264 + aac在mp4中录制只生成部分可播放的文件

时间:2015-04-13 15:52:31

标签: memory gstreamer mux

我正在尝试在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'提到here吗?

是否有解决方法?

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

任何建议,例如,指向正确的方向都将非常感激。

注意:

- 我能够生成4GB之后唯一可播放的录制文件,就是我们根本不使用任何复用器(aka byte-stream = true filename.h264)

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

我尝试了什么:

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

  • 使用队列中的漏出属性

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

  • 仅捕获视频,无音频

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

  • 使用qtmux | mp4mux

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

  • 使用tune = zerolatency属性x264enc

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

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

信息:

操作系统:Ubuntu 14.04

Gstreamer:1.4.5(也用1.3.90测试)

Proc:i5-3570 @ 3.4Ghz

Ram:4GB(也测试了2GB,8GB)

1 个答案:

答案 0 :(得分:2)

此问题最初由gstreamer-devel邮件列表回答,谢谢) - > link

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

-bug description:https://bugzilla.gnome.org/show_bug.cgi?id=741279
-patch commit:http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=2505e343b1cb29541e60afa3418c21b08ded3981