使用时间戳将原始yuv帧提供给ffmpeg

时间:2014-08-29 07:24:52

标签: android ffmpeg rtsp

我正在尝试将音频和视频原始数据传输到ffmpeg并通过Android上的RTSP协议推送实时流。 命令行看起来像这样

"ffmpeg -re -f image2pipe -vcodec mjpeg -i "+vpipepath
+ " -f s16le -acodec pcm_s16le -ar 8000 -ac 1 -i - "
+ " -vcodec libx264 "
+ " -preset slow -pix_fmt yuv420p -crf 30 -s 160x120 -r 6 -tune film "
+ " -g 6 -keyint_min 6 -bf 16 -b_strategy 1 "
+ " -acodec libopus -ac 1 -ar 48000 -b:a 80k -vbr on -frame_duration 20 "
+ " -compression_level 10 -application voip -packet_loss 20 "
+ " -f rtsp rtsp://remote-rtsp-server/live.sdp";

我使用libx264作为视频编解码器,使用libopus作为音频编解码器。 yuv帧通过mkfifo创建的命名管道提供,pcm帧通过stdin提供。

它有效,我可以通过ffplay获取和播放流。但是存在严重的音频/视频同步问题。音频比视频晚5~10秒。 我猜问题是yuv帧和pcm帧都没有任何时间戳。 FFmpeg在为数据提供时添加时间戳。但音频/视频捕获线程无法以相同的速率运行。 有没有办法为每个原始数据框添加时间戳? (比如PST / DST?)

我使用的方式来自这个帖子: Android Camera Capture using FFmpeg

1 个答案:

答案 0 :(得分:0)

FFmpeg在从管道中检索样本时添加时间戳,因此您需要做的就是同步提供它们。在你的情况下可能的问题是你已经有一个音频缓冲区,并实时提供视频帧。这让音频迟了。您必须将视频帧缓冲到与缓冲音频相同的时间。如果您无法控制音频缓冲区大小,请尝试尽可能小,监控其大小并相应地调整视频缓冲。