如何通过FFmpeg将提取的原始音视频数据包重新组装为新的MP4文件?
如何通过FFmpeg将提取的原始音视频数据包重新组装为新的MP4文件?
嘿,看你已经把MP4里的音视频数据包拆成一个个单独的.dat文件了,现在想把它们重新组装回完整的MP4是吧?我给你捋捋具体操作步骤,保证能搞定:
第一步:先拿到原文件的关键元数据
要重新封装MP4,FFmpeg得知道音视频流的编码格式、时间基、帧率这些核心信息,你可以用ffprobe从原文件里提取:
- 提取视频流的编码格式和时间基:
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,time_base -of default=noprint_wrappers=1:nokey=1 test.mp4 - 提取音频流的编码格式和时间基:
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name,time_base -of default=noprint_wrappers=1:nokey=1 test.mp4
比如输出如果是h264 1/25,就说明视频是H.264编码,时间基是1/25(对应帧率25fps)。
第二步:按顺序合并同类型的数据包
你现在是每个数据包单独存成文件,首先得把所有视频包按原文件的顺序合并成一个完整的原始视频流文件,音频包同理:
- Windows系统:
视频合并:copy /b video_sample*.dat video_raw.h264(把h264换成你实际的视频编码格式后缀,比如h265)
音频合并:copy /b audio_sample*.dat audio_raw.aac(同理,aac换成实际音频编码后缀) - Linux/macOS系统:
视频合并:cat video_sample*.dat > video_raw.h264
音频合并:cat audio_sample*.dat > audio_raw.aac
⚠️ 这里一定要注意文件顺序!必须和原文件中数据包出现的顺序完全一致,不然播放的时候会卡顿、画面错乱或者音频不同步。
第三步:用FFmpeg封装成MP4
拿到合并后的原始音视频流文件后,就可以用FFmpeg把它们封装成MP4了,用-c copy参数直接复制流,不会重新编码,保证和原文件质量一致:
ffmpeg -f [视频编码格式] -r [帧率] -i video_raw.h264 -f [音频编码格式] -i audio_raw.aac -c:v copy -c:a copy output.mp4
举个实际例子,如果视频是H.264、帧率25,音频是AAC,命令就是:
ffmpeg -f h264 -r 25 -i video_raw.h264 -f aac -i audio_raw.aac -c:v copy -c:a copy output.mp4
一些额外注意事项
- 如果封装时出现报错,比如提示缺少SPS/PPS(视频关键参数),那可能是你拆分的时候没拿到第一个关键帧的数据包,这时候可以从原文件里单独提取SPS/PPS,再合并到视频流的最前面
- 如果音频出现不同步问题,检查一下你合并数据包的顺序是否正确,或者用原文件的时间基参数来精准指定,比如给视频加上
-time_base 1/25参数 - 要是不确定编码格式,直接用
ffprobe test.mp4看完整的流信息,里面会有详细的codec_name、sample_rate等参数
备注:内容来源于stack exchange,提问作者alancc




