我有一个捕获过程,可以将原始视频数据和音频数据写入文件。这样的东西将捕获100帧数据。
./capture -n 100 -f video_file -a audio_file
给我一个768000字节的audio_file和一个414720000字节的video_file。这些似乎按预期加起来:
然后我编码像
这样的数据 ffmpeg -i audio_file -i video_file out.flv
我确实得到了一个带声音的可播放视频(实际上我在命令行中有很多东西,但这些是这个问题的重要部分)
现在,我实际上想要一个实时流,而不是一个文件,我可以这样做,只需要这样的视频:
./capture -f /dev/stdout | ffmpeg -i - udp://127.0.0.1:10000
我在udp上获得了一个没有音频广播的视频流,我能够接收并播放该流。但是当我想在图片中添加音频时,我遇到了一些问题......我想我无法在stdout
上发送它们,而且我无法使用stderr
,因为捕获过程会对此进行聊天已经。所以我试着用这样的命名管道做到这一点:
mkfifo audio_pipe
mkfifo video_pipe
ffmpeg -i audio_pipe -i video_pipe out.flv &
./capture -f video_pipe -a audio_pipe
但它不起作用,似乎一切都陷入僵局。我已经测试过只运行./capture -f video_file -a audio_file
,然后打开两个新shell并执行cat video_file > /dev/null
和cat audio_file > /dev/null
,一旦两只猫都在运行,这将取消阻止捕获过程,所以它似乎没有问题写到管道。我看了一下捕获代码的来源,它的工作方式是从更深的API进行“帧到达”回调,然后按顺序写入视频帧和音频数据(它是阻塞的)。我不知道ffmpeg是做什么的,无论是按顺序读取输入视频文件还是音频文件,还是在线程中同时读取它们。我尝试将订单更改为ffmpeg -i video_pipe -i audio_pipe out.flv
但不幸的是一切都仍然锁定。仅使用一个命名管道来处理视频数据。
如何解决我的问题?我将用python子进程模块编写脚本,一旦我理解了如何避免阻塞问题的最佳方法。
答案 0 :(得分:1)
在Linux中,管道缓冲区限制为65k,你可能会遇到死锁,捕获不会写入更多的音频,直到它可以写入更多的视频,并且ffmpeg在读取之前不会读取更多的视频更多音频。
答案 1 :(得分:1)
最后,我无法在不阻止FIFO的情况下读取ffmpeg,因此修改了捕获应用程序源代码,以便从单独的工作线程而不是按顺序写入音频帧和视频帧。