LINUX.ORG.RU

Сообщения batchar

 

Использование библиотеки fribidi для правильного отображения арабского текста

Всем привет! Пытаюсь решить проблему с библиотекой fribidi для правильного отображения арабского текста.

Арабский текст читается справо-на-лево, а физически хранится (к примеру в файле) слево-на-право. Столкнулся со следующей проблемой: текст правильно разворачивается, а вот стоящая в конце текста точка(также справедливо для запятой, восклицательного знака, многоточия) не переносится. Пример как должно быть:

Word1 Word2. --> .2droW 1droW
И как получается через fribidi:
Word1 Word2. --> 2droW 1droW.

Методом проб было выяснено, если после точки идет числовая последовательность, он нормально переносит точку и цифру. Почему не происходит перенос знаков, стоящих в конце предложения - не понимаю. Может сталкивался кто с таким поведением?

В качестве основы взял код фильтра ffmpeg - «vf_drawtext», который использует fribidi.

std::wstring document::fribidi_convert(const wchar_t* s)
{
	const FriBidiFlags flags = FRIBIDI_FLAGS_DEFAULT | FRIBIDI_FLAGS_ARABIC;
	std::wstring result(s);
	if (s != nullptr) {
		std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
		std::string byte_str = converter.to_bytes(s);

		FriBidiChar unicodestr[byte_str.size() * sizeof(FriBidiChar)] = {0};
		int unicodestr_len = fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, byte_str.c_str(),
                                                     byte_str.size(), unicodestr);

		FriBidiCharType bidi_types[unicodestr_len * sizeof(FriBidiCharType)] = {0};
		fribidi_get_bidi_types(unicodestr, unicodestr_len, bidi_types);

		FriBidiParType direction = FRIBIDI_PAR_LTR;
		FriBidiLevel embedding_levels[unicodestr_len * sizeof(FriBidiLevel)] = {0};
		if (!fribidi_get_par_embedding_levels(bidi_types, unicodestr_len,
                                                      &direction, embedding_levels)) {
                       return result;
		}

		FriBidiArabicProp ar_props[unicodestr_len * sizeof(FriBidiArabicProp)] = {0};
		fribidi_get_joining_types(unicodestr, unicodestr_len, ar_props);
		fribidi_join_arabic(bidi_types, unicodestr_len, embedding_levels, ar_props);
		fribidi_shape(flags, embedding_levels, unicodestr_len, ar_props, unicodestr);

                if (!fribidi_reorder_line(flags, bidi_types, unicodestr_len, 0,
                                  direction, embedding_levels, unicodestr, nullptr)) {
                      return result;
                }
                int i = 0, j = 0;
		for (i = 0, j = 0; i < unicodestr_len; i++) {
			if (unicodestr[i] != FRIBIDI_CHAR_FILL)
				unicodestr[j++] = unicodestr[i];
		}
		int result_len = j;
		char swap_str[(result_len * 4 + 1) * sizeof(char)] = {0};
		result_len = fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, unicodestr, result_len, swap_str);

		result = converter.from_bytes(swap_str);
	}
	return result;
}

 , ,

batchar
()

Использование gstreamer

Всем привет!

Имею плату LeopardBoard с процессором dm368 от TI.

Задача: оцифровать видеопоток с аналоговой камеры и передать по сети.

Вторым этажем подключена плата АЦП tvp5146 для оцифровки аналогового видео формата PAL. Запускаю скрипт gstreamer'а, для захвата видеопотока с железки, кодирования в H.264 и стримминга его по RTP.

Работает отлично. Сам скрипт:

gst-launch -e v4l2src always-copy=FALSE input-src=composite chain-ipipe=true ! video/x-raw-yuv,format=\(fourcc\)NV12, width=1280, height=720 ! queue ! dmaiaccel ! dmaienc_h264 encodingpreset=2 ratecontrol=2 intraframeinterval=23 idrinterval=46 targetbitrate=3000000 ! rtph264pay ! udpsink port=$PORT host=$HOST_ADDR sync=false enable-last-buffer=false

Написал программу, использующая библиотеку gstreamer'a, «нативно» повторяющая скрипт, приведеный выше.

Отладил у себя на машине, на источнике данных videotestsrс - все отлично.

Поправил источник данных v4l2src, что бы захват делать с платы АЦП. Скомпилял под плату. Пишет segmentation. ну, думаю я где-то как обычно. После проверок вписываю источник данных videotestsrc и правлю капс под него, затем компиляю под плату - работает.

Включаю дебаг:

/home/user # export GST_DEBUG=2
/home/user # ./video-encode
.....
0:00:01.704663299  1205   0x12f160 WARN                    v4l2 ../../../src/sys/v4l2/gstv4l2bufferpool.c:203:gst_v4l2_buffer_new: Failed to mmap: Cannot allocate memory
Segmentation fault

Ну, вообщем понятно. Либа пыталась выделить память, не получилось. Обращение к левой стрицы памяти привело к падению.

Я не могу понять различия своего кода и скрипта. Чего я не учел?

Приведу часть своего кода:

	/* Создание элементов  */
	GstCaps *video_caps = NULL;
	e->pipeline = gst_pipeline_new ("pipeline");
	//elements->v4l2src = gst_element_factory_make ("videotestsrc", "v4l2src");
	e->v4l2src = gst_element_factory_make ("v4l2src", "v4l2src");
	e->filter = gst_element_factory_make ("capsfilter", "filter");
	e->accel = gst_element_factory_make ("dmaiaccel", "dmaiaccel");
	e->encoder = gst_element_factory_make ("dmaienc_h264", "dmaienc_h264");
	e->queue = gst_element_factory_make ("queue", "queue");
	e->rtph264pay = gst_element_factory_make ("rtph264pay", "rtph264pay");
	e->udpsink = gst_element_factory_make ("udpsink", "udpsink");

	........

	/* Video caps */
	video_caps = gst_caps_new_simple("video/x-raw-yuv",
					"format", G_TYPE_STRING, "NV12",
					"width", G_TYPE_INT, DEFAULT_WIDTH,
					"height", G_TYPE_INT, DEFAULT_HEIGHT,
					NULL);

	/* Инициализация свойств элементов */
	g_object_set(G_OBJECT(e->filter), "caps", video_caps, NULL);
	gst_caps_unref(video_caps);


	........

	/* Инициализация свойств элементов */
	g_object_set(G_OBJECT(e->v4l2src), 
					//"device", "/dev/video0", 
					"input-src", "composite", 
					"always-copy", FALSE, 
					"chain-ipipe", TRUE, 
					//"num-buffers", 1, 
					NULL);
	
	g_object_set(G_OBJECT(e->encoder),  
					//"profile", H264_BASE_LINE,
					"encodingpreset", 2, 
					"ratecontrol", 2, 
					"intraframeinterval", DEFAULT_INTRAFRAME_INTERVAL,
					"idrinterval", DEFAULT_IDRINTERVAL,
					"targetbitrate", DEFAULT_BITRATE,
					NULL);
	
	g_object_set(G_OBJECT(e->udpsink),  
					"port", DEFAULT_PORT,
					"host", DEFAULT_HOST_ADDR,
					"sync", FALSE,
					"enable-last-buffer", FALSE, 
					NULL);

	.........

	/* Добавляю и связываю */
	gst_bin_add_many(GST_BIN(e->pipeline),
		e->v4l2src, e->accel, e->encoder, 
		e->queue, e->rtph264pay, e->udpsink, NULL);

	gst_element_link_many(e->v4l2src, e->accel, e->encoder, 
		e->queue, e->rtph264pay, e->udpsink, NULL);

	.........

	/* Запускаю */
	gst_element_set_state(elements.pipeline, GST_STATE_PLAYING);
	.........

 , ,

batchar
()

Работа с adv7280-M

Всем привет!

Ребят, кто-нибудь дружил отладочный борд Sabrelite с ADV7280-M? Имею проблему, в том что не создается файл устройства /dev/videoN, и как следствие не могу захватить видеопоток.

Имею комплект плат Sabrelite с процессором IMX6Q и ADV7280-M. ADV7280-M являет собой отладочный комплект для оцифровки аналового видео. SabreLite и ADV7280-M подключены через MIPI-CSI2 интерфейс.

Подключал согласно такой схеме

Управляется adv7280-M через драйвер, под названием adv7280_mipi_tvin. По коду драйвера понятно, что он обслуживает только i2c и по ней выполняет конфигурацию adv7280M.

Я загружаю модуль ядра mxc_v4l2_capture, который тянет за собой еще модули как зависимые. По идеи должен был появиться файл устройства в /dev/videoN. Появляется только два файла устройства /dev/video0, /dev/video1, но они будут и без подключения к ADV. Нового файла устройства, для adv7280-M не появляется.

root@linaro-alip:/home/bat# lsmod
Module                  Size  Used by
adv7280_mipi_tvin       3916  0 
mxc_v4l2_capture       22202  0 
ipu_bg_overlay_sdc      3885  1 mxc_v4l2_capture
ipu_still               1644  1 mxc_v4l2_capture
ipu_prp_enc             4586  1 mxc_v4l2_capture
ipu_csi_enc             2889  1 mxc_v4l2_capture
ipu_fg_overlay_sdc      4864  1 mxc_v4l2_capture
vivante                  947  0 
drm                   140255  1 vivante
Использую ядро от производителя комплекта, версия 3.0.35-g713b67f-dirty. Включена поддержка MIPI-CSI2, VPU и adv7280, так же ov5640 и ov8820 использующие MIPI-CSI2 на всякий случай.

Для того, что бы ядро понимало, какой адрес i2c обслeживается дрaйвером adv7280, и автоматически загрузило драйвер, пришлось редкатировать файл board-mx6_nitrogen6x.c. добавив немного кода, брал по аналогии с adv7180 и конфигурации для другого борда.

// без этой структуры при вызове метода драйвера adv7280_i2c_probe указатель на platform_data == NULL.
static struct fsl_mxc_tvin_platform_data adv7280_data = {
	.dvddio_reg	= NULL,
	.dvdd_reg	= NULL,
	.avdd_reg	= NULL,
	.pvdd_reg	= NULL,
	.pwdn		= NULL,
	.cvbs		= true,
	.io_init    = mx6q_mipi_csi1_io_init,
	/* csi slave reg address */
        // в коде драйвера адрес выставляется на 0x50(?), и используется в случае если он не определен в этой структуре. 
	.csi_tx_addr = 0x52,
};

static void mx6q_mipi_csi1_io_init(void)
{
	mxc_iomux_set_gpr_register(13, 3, 3, 1);
}

static struct mipi_csi2_platform_data mipi_csi2_pdata = {
	.ipu_id	 = 0,
	.csi_id = 0,
	.v_channel = 0,
	.lanes = 2,
	.dphy_clk = "mipi_pllref_clk",
	.pixel_clk = "emi_clk",
};


static struct i2c_board_info mxc_i2c1_board_info[] __initdata = {
	{
		I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50),
	},
#ifdef CSI0_CAMERA
	{
		I2C_BOARD_INFO("ov5642", 0x3d),
		.platform_data = (void *)&ov564x_data,
	},
#endif
#ifdef MIPI_CAMERA
	{
		I2C_BOARD_INFO("ov5640_mipi", 0x3e),
		.platform_data = (void *)&ov5640_mipi_data,
	},
	// !!!!!!!!!!!!!!!
	{
		I2C_BOARD_INFO("adv7280", 0x21),
		.platform_data = (void *)&adv7280_data,
	},
#endif
};

adv7280_mipi_tvin отрабатывает по i2c, видно на осциллографе, никаких ошибок не демонстрирует (я повтыкал выводов через printk, все норм).

Куда копать не знаю. Да и опыта большого нет с ядром и железом.

При обращении к уже созданным файлам устройства /dev/video0 или /dev/video1, которые создаются и без подключения платы, в dmesg падает сообщение: mxc_v4l_open: Mxc Camera no sensor ipu0/csi0 mxc_v4l_open: Mxc Camera no sensor ipu1/csi1

 , , ,

batchar
()

Ошибка при выделении памяти

Всем привет!

Возникла досадная проблема. Имею отладочную плату imx6q SabreLite. Ядро 3.0.35-4.1.0+yocto+g5809938.

При загрузке драйвера, для работы с АЦП, вываливается ошибка, вида:

root@nitrogen6x:~# insmod adv7180.ko 
adv7180 2-0020: chip found @ 0x40 (imx-i2c)
adv7180: Failed to probe: -5
adv7180: probe of 2-0020 failed with error -5 

Смотрю код драйвера, ошибка возникает при выделении памяти:

        v4l_info(client, "chip found @ 0x%02x (%s)\n",
			client->addr << 1, client->adapter->name);
	state = kzalloc(sizeof(struct adv7180_state), GFP_KERNEL);
	if (state == NULL) {
		ret = -ENOMEM;
		goto err;
	}

......
err:
	printk(KERN_ERR DRIVER_NAME ": Failed to probe: %d\n", ret);
	return ret;

Хотелось бы понять причину такого поведения и намек на то как ее решить.

P.S. Сделал вывод размера структуры, ее размер 624 байта. Состояние памяти, подсмотрено через top

Mem: 82616K used, 818332K free, 0K shrd, 2972K buff, 37124K cached

 , ,

batchar
()

Проверка логина и пароля пользователя системы с помощью Python, на предмет валидности.

Подскажите, может есть модуль для Python 2.7, с помощью которого можно проверить существование пользователя в системе. Интересует функция, которой на вход подать логин и пароль, ответ в виде: валиден или нет, а в идеале еще иметь возможность получить доп. параметры, вроде uid, gid.

Костылить не хочется. Может есть «штатные» средства? Задача, вроде, типовая.

Это неообходимо для небольшого самомписного сервера, к которому подключаются пользователи.

 , ,

batchar
()

Помогите реализовать RTP протокол.

Всем привет! Может подскажете как решить такую досадную проблему? Пишу небольшой RTP сервер для стриминга H.264 видео.

Предстала неизвестная проблема: через некторое время(20-30 секунд) перестает корректно воспроизводится стрим(картинка рассыпается). Я подозреваю, что как-то не так упаковываю кадры H.264 в RTP.

Кадры формируются аппаратным кодировщиком Raspberry Pi, работа с которым осуществляется через OpenMAX. Источник данных для кодировщика - камера. Ну, это собственно не так важно.

Полученыей кадр передаются небольшой нижележащей функции(send_data_to_rtp), которая пакует его в RTP. Принимает аргументы: data - указатель на изображение в памяти, len - размер изображения, framerate - колличество кадров в секунду.

// заголовки
	#define BUF_SIZE		1500
	#define RTP_PAYLOAD_MAX_SIZE	1400

	/* RTP ЗАГОЛОВОК. 12 байт */
	typedef struct{
		/* первый байт */
		uint8_t csrc_len: 	4;	
		uint8_t extension:	1;	
		uint8_t padding:	1;	
		uint8_t version:	2;	
		/* второй байт */
		uint8_t payload_type:  	7;	
		uint8_t marker:		1;	
		/* третий-четвертый байты */
		uint16_t seq_no;		
		/* пятый-восьмой байты */
		uint32_t timestamp;		
		/* девятый-двенадцатый байт */
		uint32_t ssrc;			
	}__attribute__ ((packed)) rtp_header;

	typedef struct {
		uint8_t type:		5;	
		uint8_t nri: 		2;	/*  */
		uint8_t f:		1;	/*  */
	}__attribute__ ((packed)) nalu_header;


	typedef struct {
		uint8_t type: 5;
		uint8_t nri: 2;
		uint8_t f: 1;
	} __attribute__ ((packed)) fu_indicator;


	typedef struct {
		uint8_t type: 5;
		uint8_t r: 1;
		uint8_t e: 1;
		uint8_t s: 1;
	} __attribute__ ((packed)) fu_header;

.......
// Формируем пакет
static void send_data_to_rtp(uint8_t *data, int len, int framerate)
{
	static uint8_t sendbuf[BUF_SIZE];
	static uint32_t ts_current = 0;
	static uint16_t seq_num = 0;
	static uint16_t pack_num, last_pack_size, current_pack;

	uint8_t *nalu_playload;
	/* заголовок RTP */
	rtp_header *rtp_hdr;
	/* Заголовок NALU */
	nalu_header *nalu_hdr;
	/* Заголовк NALU фрагментированых данных */
	fu_indicator *fu_ind;
	/* заголовк NALU фрагментированых данных. Идентифицирует фрагмент */
	fu_header *fu_hdr;

	ts_current += (90000 / framerate);

	memset(sendbuf, 0, sizeof(sendbuf));

	rtp_hdr = (rtp_header*)&sendbuf[0];
	
	rtp_hdr->version = 2;
	rtp_hdr->marker = 0;
	rtp_hdr->csrc_len = 0;
	rtp_hdr->extension = 0;
	rtp_hdr->padding = 0;
	rtp_hdr->ssrc = htonl(SSRC_NUM);
	rtp_hdr->payload_type = TYPE_H264;
	rtp_hdr->timestamp = htonl(ts_current);

	if (len <= RTP_PAYLOAD_MAX_SIZE) {
		rtp_hdr->marker = 1;
		rtp_hdr->seq_no = htons(++seq_num);

		nalu_hdr = (nalu_header*)&sendbuf[12];
		/* тип фрагмента */
		nalu_hdr->type = data[0] & 0x1f;
		nalu_hdr->f = data[0] & 0x80;
		nalu_hdr->nri = data[0] & 0x60 >> 5;

		nalu_playload = (uint8_t*)&sendbuf[13];
		/* Копирую буфер без ЗАГОЛОВКА(т.е. первого байта, являющийся заголовком NALU)! */
		memcpy(nalu_playload, data + 1, len-1);
		
		send_data_client(sendbuf, len + 13);
	} else {
		/* пакет не помещается в MTU, значит будем фрагментировать. 
		* Начало s = 1, e = r = 0
		* Середина s = 0, e = 0  r = 0
		* Конец s = 0, e = 1 r = 0
		*/
		/* определяю требуемое колличество пакетов */
		pack_num = (len % RTP_PAYLOAD_MAX_SIZE) ? (len / RTP_PAYLOAD_MAX_SIZE + 1) : (len / RTP_PAYLOAD_MAX_SIZE);
		/* размер данных в последнем пакете */
		last_pack_size = (len % RTP_PAYLOAD_MAX_SIZE) ? (len % RTP_PAYLOAD_MAX_SIZE) : (RTP_PAYLOAD_MAX_SIZE);

		current_pack = 0;

		/* описываю заголовки, которые используются на каждой иттерации */
		fu_ind = (fu_indicator *)&sendbuf[12];
		fu_ind->f = data[0] & 0x80;
		fu_ind->nri = (data[0] & 0x60) >> 5;
		/* говорим, что пакет у нас фрагментирован */
		fu_ind->type = 28;
		fu_hdr = (fu_header *)&sendbuf[13];
		fu_hdr->type = data[0] & 0x1f;
		
		while (current_pack < pack_num) {
			rtp_hdr->seq_no = htons(++seq_num);
			/* первый пакет */
			if(current_pack == 0) {
				/* начало фрагментированого блока */
				fu_hdr->s = 1, fu_hdr->e = 0, fu_hdr->r = 0;
				rtp_hdr->marker = 0;
				
				nalu_playload = (uint8_t*)&sendbuf[14];
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);
				/* Копирую буфер без ЗАГОЛОВКА(т.е. первого байта, являющийся заголовком NALU)! */
				memcpy(nalu_playload, data + 1, RTP_PAYLOAD_MAX_SIZE);
				send_data_client(sendbuf, RTP_PAYLOAD_MAX_SIZE + 14);
			/* середина */
			} else if(current_pack < pack_num - 1){
				fu_hdr->s = 0, fu_hdr->e = 0, fu_hdr->r = 0;
				rtp_hdr->marker = 0;

				nalu_playload = (uint8_t*)&sendbuf[14];
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);

				memcpy(nalu_playload, data + (current_pack * RTP_PAYLOAD_MAX_SIZE) + 1, RTP_PAYLOAD_MAX_SIZE);
				send_data_client(sendbuf, RTP_PAYLOAD_MAX_SIZE + 14);
			/* последний пакет */
			} else {
				rtp_hdr->marker = 1;
				nalu_playload = (uint8_t*)&sendbuf[14];
				fu_hdr->s = 0, fu_hdr->e = 1, fu_hdr->r = 0;
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);

				memcpy(nalu_playload, data + (current_pack * RTP_PAYLOAD_MAX_SIZE) + 1, last_pack_size - 1);
				send_data_client(sendbuf, last_pack_size - 1 + 14);
			}
			current_pack += 1;
		}
	}
}




// Тут пишу в сокет.
static void send_data_client(uint8_t *send_buf, size_t len_sendbuf)
{
	sendto(socket_fd, send_buf, len_sendbuf, 0, (struct sockaddr *)&addr,sizeof(addr));
}

Один из фреймов выгялит след.образом: 0000 0001 2588 804f ec82 b9bf e0b7 1789 .....

До вызова функции send_data_to_rtp отсекаю 00 00 00 01. После заголовка RTP(12 байт) и еще двух байтов(заголовки для фрагментации) последовательность в готовом пакете выгядит так 88 804f ec82 b9bf e0b7 1789 .....

Данные фрейма в правильном порядке «растекаются» по пакетам(смотрел в вайршарке) ничего лишнего не копируется и не теряется. Следовательно вопрос: правильно ли я формирую заголовки пакетов?

При воспроизведении появляются ошибки, вида(проигрывал стрим в mplayer):

V:  22.3   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 1 14, bytestream (-5)
[h264 @ 0xb6497640]concealing 68 DC, 68 AC, 68 MV errors
V:  22.3   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 16 14, bytestream (-9)
[h264 @ 0xb6497640]concealing 53 DC, 53 AC, 53 MV errors
V:  22.6   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 17 3, bytestream (-3)
[h264 @ 0xb6497640]concealing 272 DC, 272 AC, 272 MV errors
V:  22.7   0/  0 10%  1%  0.0% 0 0 

Буду премного благодарен за любой совет! Спасибо!

 , ,

batchar
()

Raspberry Pi. Стриминг h264 по RTP

Всем привет! Ребят, подскажите в чем проблема и как ее устранить. Имеется Raspberry Pi (B+) с модулем камера. С помощью утилиты raspivid снимаю h264-видеопоток и посредством ffmpeg пытаюсь стримить его по RTP.

raspivid -o - -t 0 -n -w 640 -h 480 -fps 30 -b 3000000  |  ffmpeg -y -loglevel warning -i pipe:0 -vcodec copy -f rtp "rtp://192.168.0.100:6666?pkt_size=1428&ttl=4" > stream.sdp
Seems stream 0 codec frame rate differs from container frame rate: 2400000.00 (2400000/1) -> 25.00 (25/1)
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
^Cmmal: Aborting program.0 size=   44089kB time=10000000000.00 bitrate=   0.0kbits/s


На ПК, с помощью сгененрированого SDP-файла, пытаюсь воспроизвести поток. Однако, тут происходит следующее: ffplay выволивается с кучей ошибок, через некоторое время показывает ОДИН смазаный кадр и замирает, при этом ошибки продолжают сыпаться.

bat@debian:~/Apps/gstreamer/encode$ ffplay /home/bat/Apps/stream.sdp
avplay version 0.8.16-6:0.8.16-1, Copyright (c) 2003-2014 the Libav developers
  built on Sep 17 2014 13:32:57 with gcc 4.7.2
[sdp @ 0x8f0e1a0] Estimating duration from bitrate, this may be inaccurate
Input #0, sdp, from '/home/bat/Apps/stream.sdp':
  Metadata:
    title           : No Name
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: h264 (High), yuv420p, 640x480, 90k tbr, 90k tbn, 180k tbc
[h264 @ 0x8f2eac0] error while decoding MB 3 17, bytestream (-9)7   0   
[h264 @ 0x8f2eac0] concealing 566 DC, 566 AC, 566 MV errors
[h264 @ 0x8f2eac0] error while decoding MB 34 4, bytestream (-3)2   
[h264 @ 0x8f2eac0] concealing 1055 DC, 1055 AC, 1055 MV errors
[h264 @ 0x8f105c0] error while decoding MB 28 11, bytestream (-9)   
[h264 @ 0x8f105c0] concealing 781 DC, 781 AC, 781 MV errors
[h264 @ 0x8f2eac0] error while decoding MB 31 11, bytestream (-7)

Пробовал mplayer использовать, тут ситуация чуть лучше: сыпит ошибки и секнуд через 15-20 начинает воспроизводить, при этом ошибки сыпятся. Вначале видео воспроизводится ускоренно, то что за первые секнуды он не успел показать, потом более-менее стабильно.

Movie-Aspect is undefined - no prescaling applied.
VO: [xv] 640x480 => 640x480 Planar YV12 
No pts value from demuxer to use for frame!
pts after filters MISSING
V:   0.0   0/  0 ??% ??% ??,?% 0 0 
[h264 @ 0xb63ea640]concealing 878 DC, 878 AC, 878 MV errors
[h264 @ 0xb63ea640]concealing 999 DC, 999 AC, 999 MV errors
[h264 @ 0xb63ea640]left block unavailable for requested intra4x4 mode -1 at 0 13
[h264 @ 0xb63ea640]error while decoding MB 0 13, bytestream (6271)
[h264 @ 0xb63ea640]concealing 729 DC, 729 AC, 729 MV errors
[h264 @ 0xb63ea640]error while decoding MB 22 6, bytestream (-7)
[h264 @ 0xb63ea640]concealing 987 DC, 987 AC, 987 MV errors
V:   0.0   0/  0 ??% ??% ??,?% 0 0 


Собственно хотелось бы понять, что это за ошибки и как их исправить, что бы нормально просматривать стрим. Спасибо за внимание.

 , , , ,

batchar
()

RSS подписка на новые темы