从Android设备下载文件
bash adb pull /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264 ./test.h264
用VLC播放器打开
test.h264 文件确保安装了Python (Python 3.6+)
下载文件到本地
bash adb pull /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264 ./test.h264
运行检查工具
bash python check_h264.py test.h264
查看检查结果
✅ 可以播放的标志:
- ✓ 包含SPS (序列参数集)
- ✓ 包含PPS (图像参数集)
- ✓ 包含IDR关键帧
- ✓ 有多个NALU单元(建议>10个)
❌ 不能播放的标志:
- 缺少SPS或PPS
- 只有1-2个NALU单元
- 文件太小(<100字节)
ffprobe test.h264
如果能正确显示视频信息(分辨率、帧率等),说明文件可以播放。
# 在Android设备上
adb shell "ls -lh /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264"
参考标准:
- ✅ 可以播放:通常 > 10KB(640x480@25fps,3秒约30-50KB)
- ⚠️ 可能只有1帧:< 5KB
- ❌ 文件异常:= 0KB
hexdump -C test.h264 | head -20
正常文件应该看到: 00000000 00 00 00 01 67 64 00 1f ac 72 84 44 26 84 00 00 |....gd...r.D&...| 00000010 00 01 00 00 00 01 68 ee 3c b0 44 00 00 00 01 06 |......h.<.D.....|
00 00 00 01 = Annex-B起始码(4字节)67 = SPS的NALU类型(0x67 & 0x1F = 7)68 = PPS的NALU类型(0x68 & 0x1F = 8)# 检查文件大小
adb shell "stat -c '%s' /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264"
# 查看文件前50字节
adb shell "hexdump -C /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264 | head -5"
原因:
- 编码器输出处理不完整
- SPS/PPS没有正确写入
- 编码循环提前退出
解决方案:
✅ 已经修复!新代码包含:
- 正确处理SPS/PPS配置数据
- 在关键帧时合并SPS/PPS
- 改进编码循环,处理所有输出
- 添加清空编码器功能
建议:
1. 重新编译运行应用
2. 录制至少3-5秒
3. 正常停止编码(不要强制退出)
检查步骤:
查看文件大小
bash adb shell "ls -lh /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264"
如果太小(<1KB),说明可能只有配置数据
查看Logcat日志
bash adb logcat -s H264Encoder:D | grep -E "Frame encoded|SPS/PPS|NALU"
应该看到:
bash adb shell "hexdump -C /storage/emulated/0/Android/data/com.anyun.h264/files/test.h264 | head -3" 00 00 00 01 或 00 00 01可能原因:
1. 文件格式不是纯Annex-B
2. 缺少SPS/PPS
3. 数据损坏
解决方法:
1. 使用 check_h264.py 详细检查
2. 查看Logcat确认编码过程正常
3. 尝试用ffmpeg转换:
bash ffmpeg -i test.h264 -c copy test_fixed.h264
修复后的代码应该能够:
✅ 生成可播放的H264文件
- 包含完整的SPS/PPS
- 包含多个帧(IDR + 非IDR)
- 正确的Annex-B格式
✅ 文件特征:
- 文件大小 > 10KB(3秒录制)
- NALU单元数量 > 10个
- 包含SPS (类型7)
- 包含PPS (类型8)
- 包含IDR关键帧 (类型5)
- 包含非IDR帧 (类型1)