如何使用ffmpeg-python合并内存中bytes格式的音视频?
合并内存中Bytes格式的视频与音频(Python + ffmpeg-python)
你遇到的错误是因为ffmpeg.concat只接受FilterableStream类型的输入,不能直接传入原始Bytes对象。要处理内存中的视频/音频Bytes,需要先把Bytes转换成ffmpeg能识别的输入流,以下是两种可行方案:
方案一:通过标准输入(Pipe)直接传递Bytes流
这种方式全程在内存中操作,无需写入磁盘,效率最高。核心思路是利用ffmpeg支持从pipe:读取输入的特性,分别为视频和音频创建独立的Pipe输入流,再将Bytes数据喂入对应的流中。
示例代码:
import ffmpeg # 假设你已经有内存中的视频和音频Bytes video_bytes = b"..." # 你的视频Bytes数据 audio_bytes = b"..." # 你的音频Bytes数据 # 创建视频输入流:指定视频的格式(比如mp4、avi,根据实际情况调整) video_stream = ffmpeg.input("pipe:", format="mp4") # 创建音频输入流:指定音频的格式(比如mp3、aac,根据实际情况调整) audio_stream = ffmpeg.input("pipe:", format="mp3") # 合并流并输出到Pipe(也可以指定输出文件路径) # 使用vcodec='copy'和acodec='copy'直接复制流,避免重新编码(更快且无质量损失) process = ffmpeg.output( video_stream, audio_stream, "pipe:", format="mp4", vcodec="copy", acodec="copy" ) # 运行并传入Bytes数据:input字典的key对应Pipe的索引(0对应第一个pipe:, 1对应第二个) merged_bytes, _ = process.run(input={0: video_bytes, 1: audio_bytes}) # merged_bytes 就是合并后的视频Bytes,可以直接写入文件或进一步处理
注意事项:
- 必须指定正确的
format参数:ffmpeg无法自动识别Pipe中的流格式,需要你明确传入视频/音频的原始格式(比如视频是mp4,音频是aac)。 - 如果视频和音频的编码格式不兼容目标输出格式,需要去掉
vcodec='copy'和acodec='copy',并指定合适的编码器(比如vcodec='libx264'、acodec='aac')。
方案二:使用临时文件(备选方案)
如果Pipe方式出现兼容性问题,可以用临时文件中转:将Bytes写入临时文件,让ffmpeg读取文件路径进行合并,最后清理临时文件。
示例代码:
import ffmpeg import tempfile import os video_bytes = b"..." audio_bytes = b"..." # 创建视频临时文件 with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as vid_temp: vid_temp.write(video_bytes) vid_path = vid_temp.name # 创建音频临时文件 with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as aud_temp: aud_temp.write(audio_bytes) aud_path = aud_temp.name # 使用concat合并(这里的concat接受文件路径生成的Stream) merged_bytes, _ = ( ffmpeg.concat(ffmpeg.input(vid_path), ffmpeg.input(aud_path), v=1, a=1) .output("pipe:", format="mp4") .run() ) # 清理临时文件 os.unlink(vid_path) os.unlink(aud_path)
优缺点:
- 优点:逻辑更直观,调试时可以直接查看临时文件内容。
- 缺点:涉及磁盘IO,速度比Pipe方案慢,且需要处理临时文件的清理。
内容的提问来源于stack exchange,提问作者MlgEpicBanana
相关产品推荐
相关产品推荐

