2014-08-29 55 views
0

我试图通过RTSP协议在管道上将音频和视频原始数据传输到ffmpeg并推送实时流。 命令行是这个样子将原始的yuv帧添加到带有时间戳的ffmpeg

"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

回答

0

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

+1

thx,但最后我发现我无法以这种方式同步视频/音频。我需要通过编码手动添加时间戳。 – 2014-09-02 03:02:37

+0

对于其他人如何感兴趣:我在答案中描述的内容完美无缺(因为我在自己的代码中使用它)。当然,您可以按照OP的路径使用API​​。 – 2017-04-30 14:55:50