首页 > 代码库 > 基于H.264协议的视频传输系统中遇到的问题以及解决办法
基于H.264协议的视频传输系统中遇到的问题以及解决办法
问题1、视频压缩解码模块在运用的时候出现错误:解码器再解码第二帧视频图片的时候出现异常
client: ../../decoder/T264dec.c:594:T264dec_decode_nal: Assertion `0‘ failed.
Aborted
对于该问题的分析及解决过程为:
1、 修改数据类型,所有缓存区改为unsigned char类型(原来统一为char 类型),但是还是遇到一样的异常错误,问题没有解决。
2、 查看缓存区具体内容是否与服务器端压缩的数据是一致的的,对照数据内容的时候,发现唯一的不同之处就是数据开头前缀码之后的NALU头。压缩的时候是没有显示nalu头的,但是在rtp接收部分又将nalu头加进去了,仔细对照nalu头信息,看是否是异常发生的原因所在。
实测数据:
采集端编码数据为:
encoded:115200, 1294 bytes.
len:1290 iActualLen:1294 nal_unit_type: 1
224 0 32 0 66 110 90 5 32 249 70 10 231 175166 95 96 37 212 233 92 53 154 199 129 7 9 118 49 250 191 212 183 207 56 35 6770 142 0 138 25 255 12 198 145 62 207 206
接收端接收数据为:
size=====1294
The seconde frame ! size:1298
0 0 0 1 33 224 0 32 0 66 110 90 5 32 249 7010 231 175 166 95 96 37 212 233 92 53 154 199 129 7 9 118 49 250 191 212 183207 56 35 67 70 142 0 138 25 255 12 198 145 62 207 206
接收端的nalu头为33,而由下面的测试数据可知,发生端的nalu头也是33,证明nalu头是没有错误的。
采集编码后第二帧完整数据:
encoded:115200, 1295 bytes.
0 0 0 1 33 224 0 32 0 66 186 213 115 70 13230 150 46 27 103 231 172 140 152 235 69 127 207 106 224 96 208 22 135 254 178250 185 243 215 248 240 82 245 127 158 164 16 58 105 127 136 227 130 84 195 121173 112 32 215 61 76 207 48 59 253 94 186 183 207 72 124 135 112 147 14 23 249234 130 74 64 255 249 235 134 33 126 255 231 170 113 224 175 66 32 129 106 11231 181 54 2 70 81 84 6 73 140 12 61 243 212 162 180 4 58 27 104 9 1 167 77 243106 136 49 6 137 117 127 159 47 148 197 1 20 31 249 253 78 255 243 215 208 17115 243 215 216 165 154 5 231 229 15 66 156 106 195 161 127 215 61 124 49 22 55201 207 90 54 2 3 188 21 127 243 234 30 67 189 160 40 240 131 203 184 209 174122 216 70 4 2 224 64 62 185 239 78 159 252 57 48 64 76 253 207 142 68 184 215245 203 231 215 208 72 5 12 33 210 249 245 244 18 1 40 10 75 43 39 61 125 42 54126 122 228 127 223 87 250 189 243 213 54 2 79 235 159 83 3 115 130 140 119 36228 231 215 201 36 2 65 16 23 231 170 3 152 16 33 169 237 25 240 20 11 231 23459 39 162 159 229 231 212 168 144 51 135 232 94 250 191 203 57 156 49 23 13 115212 184 194 208 28 124 105 239 130 254 48 80 101 218 5 86 2 160 33 224 163 31250 191 214 231 207 175 166 149 5 231 179 242 2 3 25 50 243 212 101 7 174 10 4310 60 122 19 254 173 245 106 224 142 56 15 5 202 189 171 130 42 7 132 24 118105 61 112 212 129 2 98 12 170 159 32 112 128 168 191 201 56 96 157 71 230 14264 63 225 141 71 65 225 243 128 140 186 249 206 153 191 158 177 208 142 192 88248 209 225 125 88 249 235 249 198 10 37 207 95 79 77 243 212 100 102 220 123255 61 99 132 98 63 190 122 225 216 112 127 190 122 254 103 252 245 246 6 30 6620 97 95 207 95 132 64 122 47 195 147 168 93 126 194 15 161 209 80 189 198 3 63141 2 95 158 191 29 184 115 116 252 57 134 47 229 128 159 236 99 186 4 60 11388 66 175 158 255 129 20 236 1 95 158 191 26 95 171 62 178 174 27 177 198 193224 239 31 6 7 90 199 255 92 190 229 32 179 135 98 47 207 194 152 224 69 48 191243 213 144 69 255 158 255 177 144 212 129 143 158 235 221 7 228 231 213 128217 200 104 108 209 181 35 11 207 95 120 32 10 240 235 254 122 253 25 220 11484 15 195 60 60 186 70 255 78 134 57 226 89 221 228 140 182 211 132 147 231 175164 25 151 103 190 240 25 118 223 159 83 33 209 127 173 124 247 255 24 20 94122 249 3 7 19 31 134 122 99 160 240 173 129 199 159 255 225 186 20 96 16 38 19119 238 48 23 216 255 52 60 187 125 2 174 123 253 129 176 48 253 171 79 207 88193 100 205 134 190 187 169 6 198 0 65 215 61 126 152 240 81 253 91 231 198 20490 56 36 125 117 151 214 43 231 168 117 14 191 216 11 201 215 190 122 249 12792 246 253 51 130 135 130 69 2 92 221 223 213 190 122 254 57 248 215 86 174 18119 207 91 109 127 215 95 61 191 166 210 231 215 230 171 30 78 122 253 49 128165 0 75 159 83 134 8 200 238 65 56 57 254 126 127 204 8 12 130 4 162 254 12495 228 137 57 253 142 75 188 191 174 28 163 4 143 129 252 160 62 32 84 95 68 12190 194 166 159 142 229 163 177 66 126 4 81 234 51 151 164 119 209 123 129 15136 177 48 96 117 255 143 77 185 136 125 2 160 75 236 13 57 63 228 13 67 232186 107 196 159 175 143 8 26 225 3 92 32 110 222 99 212 104 54 188 64 173 29 35184 129 92 32 111 12 21 194 6 240 193 243 213 182 25 187 145 120 182 142 24 62122 251 1 15 132 9 190 158 122 252 3 79 77 115 223 244 218 62 121 239 245 1 20972 80 169 124 127 19 199 128 165 4 69 92 84 143 224 52 40 128 58 128 0 249 235232 32 234 122 159 240 213 0 67 40 21 1 148 10 141 0 79 248 242 3 67 43 208 121239 255 27 132 120 102 96 192 78 24 33 54 2 56 22 186 128 137 47 237 245 207 8617 141 4 248 109 55 255 174 95 4 25 136 184 53 239 1 56 98 4 173 129 217 192125 5 79 243 177 220 48 122 166 159 254 225 63 2 40 71 248 29 224 103 43 241 60166 189 219 245 99 231 175 206 8 13 2 180 78 122 85 251 24 248 162 93 107 225187 60 34 239 238 45 39 64 127 234 255 61 125 143 57 115 3 124 245 241 208 208253 115 215 251 167 225 28 49 15 248 116 14 61 36 10 101 65 244 10 130 31 198245 254 215 159 7 211 166 99 36 231 169 85 51 179 255 88 171 159 47 142 135 72251 231 175 36 188 49 36 126 123 103 132 195 63 231 175 160 52 49 145 165 96184 249 234 52 62 31 201 24 255 61 127 48 56 169 60 245 160 56 240 82 255 61116 136 119 191 249 235 160 32 244 42 201 82 135 63 54 112 16 118 14 226 240 27247 15 32 80 123 192 72 6 185 235 233 37 174 122 142 23 112 15 65 127 175 12417 221 206 8 3 179 231 173 57 210 127 158 223 77 1 167 124 245 255 44 252 246202 161 133 250 234 207 158 231 199 26 119 4 20 201 199 103 81 31 116 14 255236 73 208 42 142 26 131 39 60 169 172 104 71 255 92 171 134 111 123 56 75 198255 32 29 184 39 124 238 154 231 174 77 233 37 235 47 172 190 173 128
送入解码器第二帧完整数据:
size=====1295
The seconde frame ! size:1299
0 0 0 1 33 224 0 32 0 66 186 213 115 70 13230 150 46 27 103 231 172 140 152 235 69 127 207 106 224 96 208 22 135 254 178250 185 243 215 248 240 82 245 127 158 164 16 58 105 127 136 227 130 84 195 121173 112 32 215 61 76 207 48 59 253 94 186 183 207 72 124 135 112 147 14 23 249234 130 74 64 255 249 235 134 33 126 255 231 170 113 224 175 66 32 129 106 11231 181 54 2 70 81 84 6 73 140 12 61 243 212 162 180 4 58 27 104 9 1 167 77 243106 136 49 6 137 117 127 159 47 148 197 1 20 31 249 253 78 255 243 215 208 17115 243 215 216 165 154 5 231 229 15 66 156 106 195 161 127 215 61 124 49 22 55201 207 90 54 2 3 188 21 127 243 234 30 67 189 160 40 240 131 203 184 209 174122 216 70 4 2 224 64 62 185 239 78 159 252 57 48 64 76 253 207 142 68 184 215245 203 231 215 208 72 5 12 33 210 249 245 244 18 1 40 10 75 43 39 61 125 42 54126 122 228 127 223 87 250 189 243 213 54 2 79 235 159 83 3 115 130 140 119 36228 231 215 201 36 2 65 16 23 231 170 3 152 16 33 169 237 25 240 20 11 231 23459 39 162 159 229 231 212 168 144 51 135 232 94 250 191 203 57 156 49 23 13 115212 184 194 208 28 124 105 239 130 254 48 80 101 218 5 86 2 160 33 224 163 31250 191 214 231 207 175 166 149 5 231 179 242 2 3 25 50 243 212 101 7 174 10 4310 60 122 19 254 173 245 106 224 142 56 15 5 202 189 171 130 42 7 132 24 118105 61 112 212 129 2 98 12 170 159 32 112 128 168 191 201 56 96 157 71 230 14264 63 225 141 71 65 225 243 128 140 186 249 206 153 191 158 177 208 142 192 88248 209 225 125 88 249 235 249 198 10 37 207 95 79 77 243 212 100 102 220 123255 61 99 132 98 63 190 122 225 216 112 127 190 122 254 103 252 245 246 6 30 6620 97 95 207 95 132 64 122 47 195 147 168 93 126 194 15 161 209 80 189 198 3 63141 2 95 158 191 29 184 115 116 252 57 134 47 229 128 159 236 99 186 4 60 11388 66 175 158 255 129 20 236 1 95 158 191 26 95 171 62 178 174 27 177 198 193224 239 31 6 7 90 199 255 92 190 229 32 179 135 98 47 207 194 152 224 69 48 191243 213 144 69 255 158 255 177 144 212 129 143 158 235 221 7 228 231 213 128217 200 104 108 209 181 35 11 207 95 120 32 10 240 235 254 122 253 25 220 11484 15 195 60 60 186 70 255 78 134 57 226 89 221 228 140 182 211 132 147 231 175164 25 151 103 190 240 25 118 223 159 83 33 209 127 173 124 247 255 24 20 94122 249 3 7 19 31 134 122 99 160 240 173 129 199 159 255 225 186 20 96 16 38 19119 238 48 23 216 255 52 60 187 125 2 174 123 253 129 176 48 253 171 79 207 88193 100 205 134 190 187 169 6 198 0 65 215 61 126 152 240 81 253 91 231 198 20490 56 36 125 117 151 214 43 231 168 117 14 191 216 11 201 215 190 122 249 12792 246 253 51 130 135 130 69 2 92 221 223 213 190 122 254 57 248 215 86 174 18119 207 91 109 127 215 95 61 191 166 210 231 215 230 171 30 78 122 253 49 128165 0 75 159 83 134 8 200 238 65 56 57 254 126 127 204 8 12 130 4 162 254 12495 228 137 57 253 142 75 188 191 174 28 163 4 143 129 252 160 62 32 84 95 68 12190 194 166 159 142 229 163 177 66 126 4 81 234 51 151 164 119 209 123 129 15136 177 48 96 117 255 143 77 185 136 125 2 160 75 236 13 57 63 228 13 67 232186 107 196 159 175 143 8 26 225 3 92 32 110 222 99 212 104 54 188 64 173 29 35184 129 92 32 111 12 21 194 6 240 193 243 213 182 25 187 145 120 182 142 24 62122 251 1 15 132 9 190 158 122 252 3 79 77 115 223 244 218 62 121 239 245 1 20972 80 169 124 127 19 199 128 165 4 69 92 84 143 224 52 40 128 58 128 0 249 235232 32 234 122 159 240 213 0 67 40 21 1 148 10 141 0 79 248 242 3 67 43 208 121239 255 27 132 120 102 96 192 78 24 33 54 2 56 22 186 128 137 47 237 245 207 8617 141 4 248 109 55 255 174 95 4 25 136 184 53 239 1 56 98 4 173 129 217 192125 5 79 243 177 220 48 122 166 159 254 225 63 2 40 71 248 29 224 103 43 241 60166 189 219 245 99 231 175 206 8 13 2 180 78 122 85 251 24 248 162 93 107 225187 60 34 239 238 45 39 64 127 234 255 61 125 143 57 115 3 124 245 241 208 208253 115 215 251 167 225 28 49 15 248 116 14 61 36 10 101 65 244 10 130 31 198245 254 215 159 7 211 166 99 36 231 169 85 51 179 255 88 171 159 47 142 135 72251 231 175 36 188 49 36 126 123 103 132 195 63 231 175 160 52 49 145 165 96184 249 234 52 62 31 201 24 255 61 127 48 56 169 60 245 160 56 240 82 255 61116 136 119 191 249 235 160 32 244 42 201 82 135 63 54 112 16 118 14 226 240 27247 15 32 80 123 192 72 6 185 235 233 37 174 122 142 23 112 15 65 127 175 12417 221 206 8 3 179 231 173 57 210 127 158 223 77 1 167 124 245 255 44 252 246202 161 133 250 234 207 158 231 199 26 119 4 20 201 199 103 81 31 116 14 255236 73 208 42 142 26 131 39 60 169 172 104 71 255 92 171 134 111 123 56 75 198255 32 29 184 39 124 238 154 231 174 77 233 37 235 47 172 190 173 128 0 0 0 1(多了的数据)
对比以上数据可知,视频数据在送入H.264解码器是多加了前缀码。(H.264编解码数据的前缀码为0001)
异常成功处理办法:
取消掉将数据送入缓冲区时,在数据后面添加前缀码的操作。
问题总结:
出现异常我们要注意检查送入解码器的数据是否符合标准(目前我使用的这款H.264压缩解码库模式输入的是YUV420格式的视频数据)。
问题2:在解码器能够流畅的解码之后,加入SDL显示部分代码。视频数据的显示不清楚。
可能的原因有两个:
1、 视频数据本身的问题
2、 SDL显示的问题
可以确定的是视频数据在传入缓存去的时候是与发送过来的数据是完全一致的,所以出问题的地方就只能是解码器解码或者是显示部分。
以前进行过响应的单图片压缩解码实验,解码器并没有出现明显错误。所以解码器解码出错的概率很小。
所以把注意力集中到SDL显示部分,摄像头采集的数据是YUV 422 格式的图片,而根据SDL显示的设置情况发现,其所针对的格式是YUV 420格式的数据。(这就是问题所在)
解决办法:
1、 寻找采集后图片格式为YUV420 格式的摄像头
2、 重写显示部分,使用SDL将YUV 422 格式的数据正确显示出来。
经过多次测试,按照YUV422的存储方式尝试读取丢失的数据,结果显示都是不正确的,并且没有多出的数据。
然后,难道是数据的问题?经过一段时间的思考,突然发现,如果这里的编码解码器一开始针对的就是YUV420格式的数据呢?那么YUV422格式的数据一开始在压缩的部分就丢掉了一部分数据。
解决办法:
1、 查找h.264压缩解码的资料,寻找设置压缩视频格式的配置内容。
2、 尝试在将数据送入压缩缓存区的时候,将YUV422的数据转换为YUV420的数据。
经过多次尝试,发现目前只能通过方法2来解决问题,于是写了一个将YUV422转换为YUV420格式的函数,并在SDL显示端使用YUV420的显示方法。结果视频显示正常,清晰度较好(颜色不太正)。
void yuyv_2_yuv420( unsigned char * pointer) { int i,j; unsigned char *Y ,*U,*V; unsigned char y1,y2,u,v; Y=yuv420_buffer; U=yuv420_buffer+IMAGEHEIGHT*IMAGEWIDTH; V=V+IMAGEHEIGHT*IMAGEWIDTH/4; //UV=yuv420_buffer+IMAGEHEIGHT*IMAGEWIDTH; for(i=0;i<IMAGEHEIGHT;i++) { for(j=0;j<IMAGEWIDTH/2;j++) { y1 = *( pointer + (i*IMAGEWIDTH/2+j)*4); u = *( pointer + (i*IMAGEWIDTH/2+j)*4 + 1); y2 = *( pointer + (i*IMAGEWIDTH/2+j)*4 + 2); v = *( pointer + (i*IMAGEWIDTH/2+j)*4 + 3); *Y++=y1; *Y++=y2; if(i%2==0) { *U++=u; *V++=v; } } } //yuv420_buffer }
数据格式说明:
H.264接收压缩的数据应该是YUV420格式的,其具体格式为YUV420中的I420/IYUV格式
SDL显示YUV422的数据用的是YUV422P的格式
SDL显示YUV420的数据用的是YV12的格式
问题3:是一个有数据传输异常和丢包导致解码异常的错误。
具体现象已经不好找了,我就说问题发生的原因和解决办法吧。
1、数据异常是由于使用RTP协议传输时,代码中出传输的数据多了一个字节。(建议按照协议格式严格检查代码)
2、RTP发送一帧分包的情况下有首包,中间包,和结尾包三种类型。当接收端接收到了尾包才认为当前帧所有数据接收完成,假如在使用RTP协议进行无线传输的时候如果遇到了丢包的情况,且丢掉的包刚好是结尾的这个包,则会出现RTP接收异常。
解决办法是检测如果丢掉了尾包,则丢掉前面接收的整个一帧数据。
YUV相关资料网址:
http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html
http://blog.csdn.net/searchsun/article/details/2443867
http://blog.163.com/lxy_7808/blog/static/169027882008727114939842/
http://blog.sina.com.cn/s/blog_5ea0192f0100vvij.html
http://www.fourcc.org/yuv.php //官方非常详细的具体格式
---Createdby 黄志刚