当前位置: 首页 > 知识库问答 >
问题:

为什么通过FFmpeg API生成的MP4不能在Windows Media Player中播放?

宰父劲
2023-03-14

现在我不知道如何添加开始代码或SPS/PPS到我的MP4,请帮我一把。我应该怎么做来生成一个可以在Windows Media Player中播放的MP4?

我已经尝试添加h264位流过滤器,但它没有工作。下面的代码:

 AVBitStreamFilterContext *bsfc = NULL;
bsfc = av_bitstream_filter_init("h264_mp4toannexb");
if (bsfc == NULL) {
            printf("bsfc is NULL\n");
}
        
av_bitstream_filter_filter(bsfc, codec_ctx, NULL, &(pkt->data), &(pkt->size), pkt->data, pkt->size, 0);

av_bitstream_filter_close(bsfc);

经过大量尝试,我发现手动将sps和pps添加到codec_ctx->extradata有效:

unsigned char sps_pps[23] = { 0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x29, 0xac, 0x1b, 0x1a, 0x12, 0xe0, 0x51, 0x90,
                              0x00, 0x00, 0x00, 0x01, 0x68, 0xea, 0x43, 0xcb };
codec_ctx->extradata_size = 23;
codec_ctx->extradata = (uint8_t*)av_malloc(23 + AV_INPUT_BUFFER_PADDING_SIZE);
if (codec_ctx->extradata == NULL) {
    printf("could not av_malloc the video params extradata!\n");
    ERR_NULL_EXIT
    }
memcpy(codec_ctx->extradata, sps_pps, 23);

共有1个答案

羊和光
2023-03-14

我最终发现问题的根本解决方法是在调用avcodec_open2之前添加一行代码。

codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

如果设置了codec_ctx->标志,编码器将在avcodec_open2()函数中设置SPS/PPS。

如果你想了解更多关于SPS/PPS的信息,你可以参考下面的网站

 类似资料:
  • 我有一个响应站点,包含html5视频。我有一些javascript可以检查视频元素的大小是否低于某个阈值。如果是,它将移除控件,将视频播放按钮覆盖图像放置在视频元素的顶部,然后将click事件添加到保存视频元素的容器中。当点击容器时,它会将视频复制到一个模态对话框中并播放视频。 现在的困境是: webm版本没有任何问题。 modal视图的mp4版本在Safari中没有问题。 如果mp4播放到位(即

  • 我了解在lambda中捕获此(修改对象属性)的正确方法如下: 但我对我所看到的以下特点感到好奇: 我感到困惑(并希望得到回答)的奇怪之处在于,为什么以下方法有效: 以及为什么我无法通过引用明确捕获此内容:

  • 我认为1534236469超出范围!Leetcode:7。反向整数我无法通过测试输入1534236469。为什么?返回范围为[Integer.MAX_VALUE,Integer.MIN_VALUE],其他应返回零 谢谢你的帮助

  • 还有一个问题是如何让html5视频工作。 我用FFMPEG创建了同一视频的3个不同格式的3个版本:mp4、ogg和WebM。 当.ogg被列为第一个html5视频源时,在chrome中可以正常播放,而.mp4被列为第一个html5视频源时,在safari中可以正常播放,但是,如果我将.mp4源列在.ogg源之上,chrome将不再加载/播放.ogg视频,因为它默认为不会播放的.mp4视频,同样,如

  • 我使用mapstruct在两个Calses之间进行映射:CandidateDTO和CandidateDTO。 我在这里的问题是,当映射时,所有DTO字段都为空,因为没有生成映射字段。 请帮忙。

  • 我正在看这个leetcode挑战: 我的代码不能通过以下测试用例: 您的输入: 输出: 预期: