Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FFmpeg摄像机编码h264 mp4 muxing atom avcC太小_Android_Video_Ffmpeg_Mp4_H.264 - Fatal编程技术网

Android FFmpeg摄像机编码h264 mp4 muxing atom avcC太小

Android FFmpeg摄像机编码h264 mp4 muxing atom avcC太小,android,video,ffmpeg,mp4,h.264,Android,Video,Ffmpeg,Mp4,H.264,我尝试将Android摄像头预览帧编码为h264,将mux编码为mp4容器 我可以成功创建mp4文件。但mp4格式似乎已损坏 使用ffprobe,我得到了以下错误 $ ffprobe o.mp4 [h264 @ 0x209fe50] non-existing PPS 0 referenced [h264 @ 0x209fe50] decode_slice_header error [h264 @ 0x209fe50] no frame! [mov,mp4,m4a,3gp,3g2,mj2 @ 0x

我尝试将Android摄像头预览帧编码为h264,将mux编码为mp4容器

我可以成功创建mp4文件。但mp4格式似乎已损坏

使用
ffprobe
,我得到了以下错误

$ ffprobe o.mp4
[h264 @ 0x209fe50] non-existing PPS 0 referenced
[h264 @ 0x209fe50] decode_slice_header error
[h264 @ 0x209fe50] no frame!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x209ea60] decoding for stream 0 failed
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x209ea60] Could not find codec parameters for stream 0 (Video: h264 (avc1 / 0x31637661), none, 568x320, 505 kb/s): unspecified pixel format
然后我使用
mp4info
工具查看信息是否正确。我找到了这个

$ mp4info o.mp4 
mp4info version 2.0.0
o.mp4:
ReadProperties: atom 'avcC' is too small; overrun at property: configurationVersion (src/mp4atom.cpp,386)
mp4info: can't open o.mp4
通过转储文件的内容,我得到了这个

$ xxd o.mp4 |grep -A 5 -B 5 avcC
0039170: 6331 0000 0000 0000 0001 0000 0000 0000  c1..............
0039180: 0000 0000 0000 0000 0000 0238 0140 0048  ...........8.@.H
0039190: 0000 0048 0000 0000 0000 0001 0000 0000  ...H............
00391a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00391b0: 0000 0000 0000 0000 0000 0000 0018 ffff  ................
00391c0: 0000 0008 6176 6343 0000 0020 7374 7473  ....avcC... stts
00391d0: 0000 0000 0000 0002 0000 004f 0000 0ea6  ...........O....
00391e0: 0000 0001 0000 0000 0000 0058 7374 7373  ...........Xstss
00391f0: 0000 0000 0000 0012 0000 0001 0000 0005  ................
0039200: 0000 000a 0000 000f 0000 0014 0000 0019  ................
0039210: 0000 001e 0000 0023 0000 0028 0000 0029  .......#...(...)
如果我没有将全局标题添加到
AVCodecContext

if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {
    // oc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
ffprobe
可以无误地检测格式,也
ffplay
可以播放格式。但是avcC原子仍然不正确。其他玩家不能玩它

为什么muxer没有编写正确的
avcC
atom


如何解决此问题?

必须在编解码器上下文中设置extradata字段。此处引用了格式:

已解决。这个问题只发生在新版本ffmpeg中

调用ffmpeg api
avformat\u write\u header/av\u write\u tailer
时,它使用
AVStream->codepar
中的数据,因为
AVStream->codec
被标记为不推荐使用

额外的数据在
avcodec\u open2
之后填充,因此我需要将额外的数据复制回
AVStream->codepar

stream->codecpar->extradata = av_malloc(oc_ctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
stream->codecpar->extradata_size = oc_ctx->extradata_size;
memcpy(stream->codecpar->extradata, oc_ctx->extradata, oc_ctx->extradata_size);
类似的代码片段也可以在ffmpeg项目中找到

if (!ost->st->codecpar->extradata && avctx->extradata) {
    ost->st->codecpar->extradata = av_malloc(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!ost->st->codecpar->extradata) {
        av_log(NULL, AV_LOG_ERROR, "Could not allocate extradata buffer to copy parser data.\n");
        exit_program(1);
    }    
    ost->st->codecpar->extradata_size = avctx->extradata_size;
    memcpy(ost->st->codecpar->extradata, avctx->extradata, avctx->extradata_size);
}