gpt4 book ai didi

c - avformat_write_header 在 ffmpeg 中无法正常工作

转载 作者:行者123 更新时间:2023-11-30 16:48:23 29 4
gpt4 key购买 nike

我正在使用 FFMPEG 进行 mp4 文件创建项目,我尝试基于 FFMPEG 复用、重复用代码转换视频数据包的流信息,但转换为文件后 header 损坏,因此文件已损坏。

/* this code used to set the stream information */

AVFormatContext *input_context,*output_context;
AVDictionary *opt;
AVStream *out_stream;
AVCodecContext *newcontext = NULL;
out_stream= avformat_new_stream(output_context,NULL);
newcontext = avcodec_alloc_context3(codec);
newcontext->codec_id=Output_fmt->video_codec;
newcontext->bit_rate =in_stream->codec->bit_rate;
newcontext->width = in_stream->codec->width;
newcontext->height = in_stream->codec->height;
newcontext->timecode_frame_start = in_stream->codec->timecode_frame_start;
newcontext->gop_size = in_stream->codec->gop_size;
newcontext->profile = in_stream->codec->profile;
newcontext->level = in_stream->codec->level;
newcontext->pix_fmt = PIX_FMT_YUV420P;
newcontext->frame_size = in_stream->codec->frame_size;
newcontext->sample_fmt = in_stream->codec->sample_fmt;
newcontext->sample_rate = in_stream->codec->sample_rate;
time_base = (double)in_stream->time_base.num / (double)in_stream->time_base.den;
duration = (double)in_stream->duration * time_base * 1000.0;
if (!out_stream) {
fprintf(stderr, "Failed allocating output stream\n");
ret = AVERROR_UNKNOWN;
return;
}
ret = avcodec_copy_context(out_stream->codec,newcontext);
if (ret < 0) {
fprintf(stderr, "Failed to copy context from input to output stream codec context\n");
goto end;
}
out_stream->codec->codec_tag = 0;
if (output_context->oformat->flags & AVFMT_GLOBALHEADER)
out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

使用以下方式更改标题信息:

/* this code used to set the metadata */

av_dict_set(&opt, "major_brand", "mp42", 0);
av_dict_set(&opt, "minor_version","512" , 0);
av_dict_set(&opt, "compatible_brands","isomiso2avc1mp41",0);
av_dict_set(&opt, "comment","Hash=855738390",0);
output_context->metadata = opt;
ret = avformat_write_header(output_context,NULL);

创建 mp4 文件后,在终端中使用 ffmpeg 检查文件。出现这样的错误:

/此错误消息/

[mpeg4 @ 0x7ff2b9811c00] header damaged Last message repeated 39times [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff2ba800000] decoding for stream 0failed [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff2ba800000] Could not find codecparameters for stream 0 (Video: mpeg4 (mp4v / 0x7634706D), none, 376kb/s): unspecified size Consider increasing the value for the'analyzeduration' and 'probesize' options.

最佳答案

最简单的事情就是下载一个免费软件十六进制编辑器(适用于您的特定操作系统)。接下来是使用桌面(命令行)版本的 FFmpeg(下载静态版本)

  • 使用命令行 FFmpeg 将 Source 转换为 MP4(即:mp4_ffmpeg.mp4)
  • 使用您的代码将 Source 转换为 MP4(mp4_code.mp4)
  • 打开 mp4_ffmpeg.mp4mp4_code.mp4 并比较字节。有效的应该是 mp4_ffmpeg.mp4 那么与您的代码生成的字节有什么不同?

要寻找的东西:

  • 全部以ftyp开头?
  • moov 是 header ,应该位于开始位置(有时位于 mdat 之后,它将所有 A/V 数据保存在一个 block 中。要移动任何 mp4 到前面或开始字节,然后使用 -movflags +faststart 例如在命令行中使用:
    ffmpeg -i myfile.avi -movflags +faststart newfile.mp4 )

  • 在每个单词moovmdat之前,前4个字节是跳过单词的4个字母后的大小(以字节为单位)。 .这些尺寸正确吗?

  • 您是否已定义所有 MP4 原子(元数据部分)?它们与 FFmpeg 为其 MP4 转换版本生成的内容相匹配吗?

关于c - avformat_write_header 在 ffmpeg 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42973869/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com