Форум программистов, компьютерный форум CyberForum.ru

Ffmpeg выдает moov atom not found если прервать процесс кодирования - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Алгоритм обхода в игре "точки" http://www.cyberforum.ru/cpp/thread1657196.html
пишу игру "точки" на с++ в VS form, по клику заполняю два вектора с точками, vector<MyPoint> One; vector<MyPoint> Two; мне нужно найти все области длины одной клетки и проверить если там точка из другого вектора точек, не могу придумать алгоритм обхода, прощу помочь как можно скорее!! https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B8_(%D0%B8%D0%B3%D1%80%D0%B0) пробовал построение...
C++ Определение версии операционной системы Помогите пожалуйста! Написать программу которая определяет версию операционной системы http://www.cyberforum.ru/cpp/thread1657032.html
Марафон Безопасности C++
Суть марафона заключается в том, что хотелось бы увидеть как можно больше exe файлов на языке C++, в котором будет одно текстовое поле, в которое надо ввести ваш ключ/пароль и появится ваше кодовое слово (что-то типо получаем полный софт, введя ключ к программе), после чего вы выкладываете данную программу без исходников сюда, все ее анализируют и находят пароль к данной программе, после чего...
C++ Алгоритм обработки фотографий с "Google улицы"
есть ли в открытом доступе алгоритм обработки фотографий с google улицы
C++ Задания по C++ http://www.cyberforum.ru/cpp/thread1655759.html
Ребят помогите сделать задания: 1. Создайте структуру с именем time. Три ее поля, имеющие тип int, будут называться hours, minutes и seconds. Напишите программу которая просит пользователя ввести время, в формате часы, минуты и секунды.Программа должна хранить время в структурной переменной типа time и выводить количество секунд в веденном времени. 2. Создайте перечисление с именем pets и...
C++ Алгоритм обработки фотографий камеры 360 градусов Ребят есть ли какой код поясняющий принцип обработки этой камерой фотографий и предствлении их в формате 360 градусов или может кто знает на каком языке он может быть написан ( пишу в с++ потому что кажется что на ней) приму любую информацию подробнее

Показать сообщение отдельно
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,741

Ffmpeg выдает moov atom not found если прервать процесс кодирования - C++

08.02.2016, 10:27. Просмотров 1064. Ответов 22
Метки (Все метки)

имеется код выполняющий кодирование и запись видео в файл (через avio_open2 / avformat_write_header / av_interleaved_write_frame / av_write_trailer / avio_close)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
extern "C" {
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libswscale/swscale.h>
}
 
#include <stdio.h>
#include <windows.h>
#include <time.h>
 
int main(int argc, char *argv[])
{
  AVFormatContext *ofcx;
  AVOutputFormat *ofmt;
  AVStream *ost;
 
  AVPacket pkt;
 
  const char *sFileOutput = "test.mp4";
 
  // Initialize library
  av_register_all();
  avformat_network_init();
 
  //
  // Output
  //
 
  //open output file
  ofmt = av_guess_format( NULL, sFileOutput, NULL );
  ofcx = avformat_alloc_context();
  ofcx->oformat = ofmt;
 
  int w = 800;
  int h = 600;
  int den = 25;
  int gop_size = 10;
  int codec_id = CODEC_ID_H264;
 
  // Create output stream
  AVCodec *ocodec = avcodec_find_encoder( (AVCodecID)codec_id );
  ost = avformat_new_stream( ofcx, ocodec );
  ost->codec->width = w;
  ost->codec->height = h;
  ost->codec->pix_fmt = ocodec->pix_fmts[0];
  ost->codec->time_base.num = 1; 
  ost->codec->time_base.den = den; 
  ost->time_base.num = 1;
  ost->time_base.den = den;
  ost->codec->gop_size = gop_size; 
  if ( ofcx->oformat->flags & AVFMT_GLOBALHEADER ) ost->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
  avcodec_open2( ost->codec, ocodec, 0 );
  
  AVFrame *frame = av_frame_alloc();
  frame->format = PIX_FMT_YUV420P;
  frame->width = w;
  frame->height = h;
  int buffer_size = avpicture_get_size(PIX_FMT_YUV420P, w, h);
  uint8_t *buffer = (uint8_t *)av_malloc(buffer_size * sizeof(uint8_t));
  avpicture_fill((AVPicture *)frame, 0, PIX_FMT_YUV420P, w, h);
 
  frame->data[0] = buffer;
  frame->data[1] = frame->data[0] + w * h;
  frame->data[2] = frame->data[1] + (w * h) / 4;
  frame->linesize[0] = w;
  frame->linesize[1] = w / 2;
  frame->linesize[2] = w / 2;
 
  avio_open2( &ofcx->pb, sFileOutput, AVIO_FLAG_WRITE, NULL, NULL );
 
  avformat_write_header( ofcx, NULL );
 
  av_init_packet( &pkt );
  for ( int i = 0; i < 25 * 10; i++ )
  {
        /* Y */
        for ( int y = 0; y < ost->codec->height; ++y ) {
            for ( int x = 0; x < ost->codec->width; ++x ) {
                frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
            }
        }
 
        /* Cb and Cr */
        for ( int y = 0; y < ost->codec->height / 2; ++y ) {
            for ( int x = 0; x < ost->codec->width / 2; ++x ) {
                frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
                frame->data[2][y * frame->linesize[2] + x] =  64 + x + i * 5;
            }
        }
 
        frame->pts = av_rescale_q(i, ost->codec->time_base, ost->time_base);
 
        int got_packet;
        if (avcodec_encode_video2(ost->codec, &pkt, frame, &got_packet) != 0) break;
 
        if (got_packet) 
        {
            av_interleaved_write_frame( ofcx, &pkt );
            av_free_packet( &pkt );
            avio_flush(ofcx->pb);
        }
  }
  av_write_trailer( ofcx );
  avio_close( ofcx->pb );
  avformat_free_context( ofcx );
 
  return 0;
}

если прервать процесс кодирования до вызова av_write_trailer (закрыть программу до того как процесс будет завершен, прервать выполнение программы завершив процесс из диспетчера задач, отключить питание ПК), то файл формируется неправильно и не может быть воспроизведен - ffprobe выдает сообщение
[mov,mp4,m4a,3gp,3g2,mj2 @ 00d44c20] moov atom not found
test.mp4: Invalid data found when processing input
castaway предложил код производящий прямую запись пакетов получаемых при кодировании на диск (через fopen / fwrite / fclose)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
 
extern "C" {
 #define __STDC_CONSTANT_MACROS
 #include <libavutil/opt.h>
 #include <libavutil/imgutils.h>
 #include <libavformat/avformat.h>
 #include <libavcodec/avcodec.h>
}
 
int main()
{
    avcodec_register_all();
    av_register_all();
 
    AVCodec * codec = avcodec_find_encoder( AV_CODEC_ID_H264 );
    if ( codec ) {
        AVCodecContext * avCtx = avcodec_alloc_context3( codec );
        if ( avCtx ) {
 
            /// MUST be set by user.
            avCtx->width    = 720;
            avCtx->height   = 304;
 
            /// Set by user.
            avCtx->pix_fmt  = AV_PIX_FMT_YUV420P;
 
            avCtx->gop_size = 10;
            avCtx->max_b_frames = 1;
 
            /// MUST be set by user.
            avCtx->time_base = (AVRational){ 1, 25 }; // 1/fps
 
            /// Set by user; unused for constant quantizer encoding.
            avCtx->bit_rate = 1024 * 256;
 
            av_opt_set( avCtx->priv_data, "preset", "slow", 0 );
 
            if ( avcodec_open2( avCtx, codec, 0 ) >= 0 ) {
                AVFrame * frame = av_frame_alloc();
                if ( frame ) {
                    frame->format = avCtx->pix_fmt;
                    frame->width  = avCtx->width;
                    frame->height = avCtx->height;
 
                    int ret = av_image_alloc( frame->data, frame->linesize, avCtx->width, avCtx->height, avCtx->pix_fmt, 32 );
                    if ( ret >= 0 ) {
 
                        FILE * fp = fopen( "out.mp4", "wb+" );
                        if ( !fp ) {
                            std::cerr << "can't open output file\n";
                            return 1;
                        }
 
                        AVPacket pkt;
                        int got_output;
                        for ( int i = 0; i < 25 * 10/*seconds*/; ++i ) {
                            av_init_packet( &pkt );
                            pkt.data = NULL; // packet data will be allocated by the encoder
                            pkt.size = 0;
 
                            /* Y */
                            for ( int y = 0; y < avCtx->height; ++y ) {
                                for ( int x = 0; x < avCtx->width; ++x ) {
                                    frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3;
                                }
                            }
 
                            /* Cb and Cr */
                            for ( int y = 0; y < avCtx->height / 2; ++y ) {
                                for ( int x = 0; x < avCtx->width / 2; ++x ) {
                                    frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2;
                                    frame->data[2][y * frame->linesize[2] + x] =  64 + x + i * 5;
                                }
                            }
                            frame->pts = i;
 
                            ret = avcodec_encode_video2( avCtx, &pkt, frame, &got_output );
                            if ( ret >= 0 && got_output ) {
                                fwrite( pkt.data, 1, pkt.size, fp );
                                av_packet_unref( &pkt );
                            }
                        }
 
                        /* get the delayed frames */
                        do {
                            ret = avcodec_encode_video2( avCtx, &pkt, NULL, &got_output );
                            if ( ret >= 0 && got_output ) {
                                fwrite( pkt.data, 1, pkt.size, fp );
                                av_packet_unref( &pkt );
                            }
                        } while ( got_output );
 
                        fclose( fp );
                    }
 
                    av_frame_free( &frame );
                }
            }
            av_free( avCtx );
        }
        avcodec_close( avCtx );
    }
}

файл формируемый этим кодом может быть воспроизведен даже в случае прерывания процесса кодирования. однако файлы получаемые в результате работы этого кода имеют некие особенности из-за которых они не могут быть воспроизведены например через VLC или KMP. вот что выдает ffprobe для файла формируемого моим кодом
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.30.100
Duration: 00:00:09.32, start: 0.000000, bitrate: 791 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x600,
789 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
и вот что выдает ffprobe для кода castaway
Input #0, h264, from 'out.mp4':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p, 720x304, 25 fps, 25 tbr, 1200k tbn
, 50 tbc
видна некая "неполнота" файла...
вопрос - как правильно записывать файл содержащий всю необходимую для воспроизведения информацию что бы прерывание процесса кодирования не приводило к его повреждению? нужна либо правка моего метода делающая его устойчивым к прерыванию кодирования либо правка метода castaway формирующая файл корректно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru