audio - 使用 gstreamer 将同步的视频和音频记录到容器文件中

标签 audio video gstreamer

我正在使用 TI DM365 EVM 来录制视频和音频。我需要对这两个流进行编码并将它们保存在容器文件中,例如 .avi 或 .mp4。我正在使用以下 gstreamer 管道:

gst-launch v4l2src always-copy=FALSE num-buffers=-1 do-timestamp=TRUE ! 'video/x-raw-yuv,format=(fourcc)NV12,width=1280,height=720,framerate=30/1' ! queue ! TIVidenc1 codecName=h264enc engineName=codecServer byteStream=false genTimeStamps=true ! queue ! mux. alsasrc num-buffers=-1 typefind=TRUE do-timestamp=TRUE ! audio/x-raw-int,width=16 ! queue ! TIAudenc1 codecName=aaclcenc engineName=codecServer genTimeStamps=true name=aenc ! queue ! mux. avimux name=mux ! filesink location=vidaudtest.avi sync=true

结果是我得到了一个 .avi 文件,但是当我使用 Totem Movie Player 在 PC 上播放该文件时,视频播放速度过快而音频以正常速度播放。例如,在 5 分钟的文件中,视频在 40 秒内播放完毕。

此外,在录制时,我收到了一些这样的消息:

WARNING: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Can't record audio fast enough
Additional debug info:
gstbaseaudiosrc.c(822): gst_base_audio_src_create (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:
Dropped 33516 samples. This is most likely because downstream can't keep up and is consuming samples too slowly.

还有其他人看到过这种行为吗?有什么想法或解决方案吗?

最佳答案

我想问题是您的设备无法以您请求的速率传送帧。 一个可能的解决方案是通过 videorate 元素运行它来“重新采样”您的视频流:

v4l2src ! 'video/x-raw-yuv,format=(fourcc)NV12,width=1280,height=720' ! videorate force-fps=30  ! ...

更新:或者像这样的东西也可以工作:

... ! 'video/x-raw-yuv,format=(fourcc)NV12,width=1280,height=720' ! videorate ! 'video/x-raw-yuv,framerate=(fraction)30/1' ! ...

关于audio - 使用 gstreamer 将同步的视频和音频记录到容器文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020290/

相关文章:

javascript - 如何在 chromium 浏览器中创建文本或将文本转换为音频?

c++ - 示波器算法,动态数据输入,极限输出数据

android - 音频编程和音调合成

performance - 从程序访问远程视频

tcp - 使用 tcpserversink 将 gstreamer 流式传输到 vlc

jquery - jQuery音频停止/暂停更改

python - 如何确定python中视频的开始时间和结束时间(自纪元以来的秒数)?

javascript - 为什么我可以在 css 中将 gif 设置为背景图片 url(),但不能将视频 mp4 设置为背景 url?

audio - 重新编码音频:gstreamer中的libav编码器/解码器

android - 在 Android 版 GStreamer 中启用 OMX 支持