FFmpeg:每个块都刷新输出文件

9
我正在使用ffmpeg实时生成10秒钟的正弦波。不幸的是,ffmpeg似乎只在几秒钟后才刷新输出文件。我希望它每2048字节(=2字节采样宽度*1024个采样点,我的自定义块大小)刷新一次。
以下脚本的输出:
import os
import time
import subprocess

cmd = 'ffmpeg -y -re -f lavfi -i "sine=frequency=440:duration=10" -blocksize 2048 test.wav'    

subprocess.Popen(cmd, shell=True)

time.sleep(0.1)
while True:
    print(os.path.getsize("test.wav"))
    time.sleep(0.1)

看起来像:

[...]
78
78
78
262222
262222
262222
[...]

一个 #ffmpeg IRC 上的用户提出使用
ffmpeg -re -f lavfi -i "sine=frequency=1000:duration=10" -f wav pipe: > test.wav

这可以实现。但是仅使用ffmpeg是否足够?
1个回答

13

在将输出写入文件时,FFmpeg会等待填充一个256 KiB的缓冲区才会进行写入。

您可以使用flush_packets来禁用此行为。

ffmpeg -y -re -f lavfi -i "sine=f=440:d=10" -blocksize 2048 -flush_packets 1 test.wav

我该如何检测它是否正常工作?我使用了“-blocksize 32 -flush_packets 1”,但是输出在3-4秒后只有600字节的数据!我使用了“libopencore_amrnb”编解码器,需要每秒获取数据。 - peiman F.
libopencore_amrnb 可能正在进行一些内部缓冲? - rogerdpack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接