FFmpegFrameRecorder 切分视频文件时结束条件设置不当导致切分后的文件过短问题

问题

下游反馈使用 ffmpeg 切割后的音频文件,无法正确识别其声音的性别

排查流程

1,由于线上大部分用户上传音频后,进行切分后的音频都没问题,因此考虑到这些无法识别性别的音频,有格式问题,需要找出其共性,因此查日志导出所有的错误音频

2,发现这些音频格式都是 mp4(mp4 其实是视频文件但是也包含音频)

3,考虑下游不支持识别 mp4 编码的音频,所以做了一个实验:将完整的音频丢给下游,发现可以正确识别

4,简单看了一下代码了解逻辑,考虑是 ffmpeg 内部切分问题,执行 mp4.ffmpeg -i input.mp4 -ac 1 -ar 16000 output.wav 这条命令,并了解 ffmpeg 在内部会做什么。可能是因为内部切分消息不当导致报错的

5,了解采样率、声道、通道数、样本格式为16位,显式设置音频编码器为 MP3。使用 ffmpeg 拆分 mp3 音频,发现没问题。使用 FFmpegFrameRecorder 拆分 mp4 音频,并且导出,发现只截取了前 130 ms 的内容

6,跟代码发现一个 break 逻辑,很可能是这个问题,结果测试发现,视频没结束但是 frame.samples 为 null 了。发现问题根源

java 复制代码
                while ((frame = grabber.grabFrame()) != null) {
                	// samples 表示音频帧,有些视频文件的中间音频帧为空
                    if (frame.samples == null) {
                        // 加了这一层判断,处理了问题。这里额外做音频帧的判断
//                        if (frame.image != null) {
//                            continue;
//                        }
                        break;
                    }
                    // 业务逻辑
                    ...
                }

问题总结

视频文件的中间音频帧可能为空导致的问题

相关推荐
开开心心就好14 小时前
手机虚拟化学实验室,混合燃烧都能模拟
jupyter·智能手机·ffmpeg·计算机外设·电脑·音视频·visual studio
VidDown15 小时前
用户说“卡顿“,服务器一切正常:播放质量监测与 QoE 指标
运维·服务器·ffmpeg·音视频·视频
开开心心就好15 小时前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
智能直播2 天前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
八月的雨季 最後的冰吻3 天前
FFmepg-- 42-ffplay.c 线程安全机制深度分析
c语言·安全·ffmpeg
开开心心就好3 天前
把手机变成电脑麦克风,WiFi连接就能用
智能手机·ffmpeg·计算机外设·电脑·word·音视频
@嵌入式扫地僧4 天前
FFmpeg 解码 H.264 流提取 SEI 用户数据实战
ffmpeg·h.264·流媒体开发·sei 解析·自定义 sei
VimorphTech4 天前
ffmpeg.wasm 实战:浏览器提取视频音频,如何处理进度、取消和资源释放?
ffmpeg
小小龙学IT4 天前
FFmpeg 开源多媒体处理框架深度解析:从命令行到 libav* 全家桶
c语言·ffmpeg·开源
ofoxcoding5 天前
Gemini TTS 与 ElevenLabs 语音合成实测:同一段视频旁白效果对比
ai·ffmpeg·音视频