avformat_write_header не работает должным образом в ffmepg

Я работал над проектом создания файла mp4 с использованием FFMPEG, я пытался преобразовать информацию о потоке видеопакета на основе мультиплексирования FFMPEG, кода повторного смешивания, но заголовок был поврежден после преобразования в поврежденный файл.

/ * этот код использует информацию о потоке */

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;

Изменил информацию заголовка, используя: /* этот код, используя набор метаданных */

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] поврежден Последнее сообщение повторено 39 раз [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff2ba800000] не удалось декодировать для потока 0 [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff2ba800000] Не удалось найти параметры кодека для потока 0 (видео: mpeg4 (mp4v / 0x7634706D), нет, 376 кбит / с): неопределенный размер Рассмотрите возможность увеличения значения для параметров "Analysisuration" и "probesize".

1 ответ

Проще всего просто скачать бесплатный редактор hex (для вашей конкретной ОС). Далее следует использовать настольную (командную) версию FFmpeg (скачать статическую сборку)

  • Используйте командную строку FFmpeg для преобразования источника в MP4 (то есть: как mp4_ffmpeg.mp4)
  • Используйте свой код для преобразования исходного кода в MP4 (то есть: как mp4_code.mp4)
  • Откройте оба mp4_ffmpeg.mp4 & mp4_code.mp4 и сравнить байты. Рабочий должен быть mp4_ffmpeg.mp4 так что же отличается от байтов, созданных вашим кодом?

На что обратить внимание:

  • Все начинается с ftyp?
  • moov является заголовком и должен быть в начале (иногда после mdat который содержит все данные в одном чанке. Чтобы переместить заголовок любого mp4 на передний или начальный байты, используйте -movflags +faststart например, в командной строке:
    ffmpeg -i myfile.avi -movflags +faststart newfile.mp4)

  • Перед каждым словом moov или же mdatпредыдущие 4 байта - это размер (в байтах) после того, как вы пропустили 4 буквы слова... правильны ли эти размеры?

  • У вас есть все атомы MP4 (разделы метаданных)? Они соответствуют тому, что FFmpeg произвел для своей версии конвертации MP4?

Другие вопросы по тегам