iOS视频推流格式转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS视频推流格式转换相关的知识,希望对你有一定的参考价值。
参考技术A 视频采集会得到格式为CMSampleBufferRef的视频包,视频推流一般把视频流转换成flv格式(1)首先将视频流转换成YUV的数据格式
//获取yuv数据
- (NSData*)convertVideoSmapleBufferToYuvData:(CMSampleBufferRef)videoSample
//通过CMSampleBufferGetImageBuffer方法,获得CVImageBufferRef,里面就包含了YUV420数据的指针
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(videoSample);
//锁住格式转换线程,开始转换格式
CVPixelBufferLockBaseAddress(pixelBuffer,0);
//获取图像宽度(像素)
size_t pixelWidth = CVPixelBufferGetWidth(pixelBuffer);
//获取图像高度(像素)
size_t pixelHeight = CVPixelBufferGetHeight(pixelBuffer);
//计算YUV中的Y所占字节数
size_t y_size = pixelWidth * pixelHeight;
//计算YUV中的U和V分别所占的字节数
size_t uv_size = y_size /4;
uint8_t * yuv_frame = aw_alloc(uv_size *2+ y_size);
//获取pixelBuffer中的Y数据
uint8_t * y_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer,0);
memcpy(yuv_frame, y_frame, y_size);
//获取pixelBuffer中的UV数据
uint8_t * uv_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer,1);
memcpy(yuv_frame + y_size, uv_frame, uv_size *2);
//获取到想要的数据,解锁格式转换线程
CVPixelBufferUnlockBaseAddress(pixelBuffer,0);
//yuv格式---->nv12格式
NSData * yuvData = [NSData dataWithBytesNoCopy:yuv_frame length:y_size + uv_size *2];
//由于相机偏转,我们需要对的到的视频页面进行旋转
return [self rotateNV12Data:nv12Data];
(2)由于相机偏转,我们需要对的到的视频页面进行旋转
- (NSData*)rotateNV12Data:(NSData*)nv12Data
int degree = 0;
switch(self.videoConfig.orientation)
case UIInterfaceOrientationLandscapeLeft:
degree = 90;
break;
case UIInterfaceOrientationLandscapeRight:
degree = 270;
break;
default:
//do nothing
break;
if(degree !=0)
uint8_ t * src_nv12_bytes = (uint8_t*)nv12Data.bytes;
uint32_t width = (uint32_t)self.videoConfig.width;
uint32_t height = (uint32_t)self.videoConfig.height;
uint32_t w_x_h = (uint32_t)(self.videoConfig.width*self.videoConfig.height);
uint8_t * rotatedI420Bytes =aw_alloc(nv12Data.length);
NV12ToI420Rotate(src_nv12_bytes, width,
src_nv12_bytes + w_x_h, width,
rotatedI420Bytes, height,
rotatedI420Bytes + w_x_h, height /2,
rotatedI420Bytes + w_x_h + w_x_h /4, height /2,
width, height, (RotationModeEnum)degree);
I420ToNV12(rotatedI420Bytes, height,
rotatedI420Bytes + w_x_h, height /2,
rotatedI420Bytes + w_x_h + w_x_h /4, height /2,
src_nv12_bytes, height, src_nv12_bytes + w_x_h, height,
height, width);
aw_free(rotatedI420Bytes);
return nv12Data;
(3)将nv12格式的数据合成为flv格式
- (aw_flv_video_tag*)encodeYUVDataToFlvTag:(NSData*)yuvData
if(!_vEnSession)
return NULL;
OSStatus status = noErr;
//获取视频宽度
size_t pixelWidth = self.videoConfig.pushStreamWidth;
//获取视频高度
size_t pixelHeight = self.videoConfig.pushStreamHeight;
//NV12数据->CVPixelBufferRef中
//硬编码主要调用VTCompressionSessionEncodeFrame函数,此函数处理的是CVPixelBufferRef类型。
CVPixelBufferRef pixelBuf =NULL;
//初始化pixelBuf
CVPixelBufferCreate(NULL, pixelWidth, pixelHeight,kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,NULL, &pixelBuf);
if(CVPixelBufferLockBaseAddress(pixelBuf,0) != kCVReturnSuccess)
NSLog(@"encode video lock base address failed");
return NULL;
//将YUV数据填充到CVPixelBufferRef中
size_t y_size = aw_stride(pixelWidth) * pixelHeight;
size_t uv_size = y_size /4;
uint8_t * yuv_frame = (uint8_t*)yuvData.bytes;
//获取y frame
uint8_t * y_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuf,0);
memcpy(y_frame, yuv_frame, y_size);
//获取uv frame
uint8_t * uv_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuf,1);
memcpy(uv_frame, yuv_frame + y_size, uv_size *2);
//编码CMSampleBufRef
//获取时间戳,由于视频帧是有顺序的,所以timestamp可以自定义一个累加字段
uint32_t ptsMs = timestamp+1;//self.vFrameCount++ * 1000.f / self.videoConfig.fps;
CMTime pts =CMTimeMake(ptsMs,1000);
//将NV12数据的PixelBuf送到硬编码器中,进行编码。
status = VTCompressionSessionEncodeFrame(_vEnSession, pixelBuf, pts,kCMTimeInvalid,NULL, pixelBuf,NULL);
if(status == noErr)
dispatch_semaphore_wait(self.vSemaphore,DISPATCH_TIME_FOREVER);
if(_naluData)
//硬编码成功,_naluData内的数据即为h264视频帧。
//因为是推流,所以需要获取帧长度,转成大端字节序,放到数据的最前面
uint32_t naluLen = (uint32_t)_naluData.length;
//小端转大端。计算机内一般都是小端,而网络和文件中一般都是大端。大端转小端和小端转大端算法一样,就是字节序反转就行了。
uint8_t naluLenArr[4] = naluLen >>24&0xff, naluLen >>16&0xff, naluLen >>8&0xff, naluLen &0xff;
//数据拼接
NSMutableData * mutableData = [NSMutableData dataWithBytes:naluLenArr length:4];
[mutableData appendData:_naluData];
//h264 -> flv tag,合成flvtag之后就可以直接发送到服务端了。
aw_flv_video_tag * video_tag = aw_encoder_create_video_tag((int8_t*)mutableData.bytes, mutableData.length, ptsMs,0,self.isKeyFrame);
//编码完成,释放数据。
_naluData = nil;
_isKeyFrame = NO;
CVPixelBufferUnlockBaseAddress(pixelBuf,0);
CFRelease(pixelBuf);
return video_tag;
else
NSLog(@"encode video frame error");
CVPixelBufferUnlockBaseAddress(pixelBuf,0);
CFRelease(pixelBuf);
return NULL;
android中如何将抓取到的视频流转换为能播放的视频格式?
《android逆向视频》百度网盘资源免费下载
链接:https://pan.baidu.com/s/1W1NAE-AeKbz0bb6E4mdXfA
android逆向视频|第一章:Android Java 逆向基础|第五章:Android arm native 逆向|第四章:Android 系统编译|第三章:阶段考核|第七章:Android 应用脱壳|第六章:Android 应用初步编程保护|第二章:Android Hook 插件开发|第八章:Android 应用保护|课时4 Android 加壳保护工具编写3.mp4|课时3 Android 加壳保护工具编写2.mp4|课时2 Android 加壳保护工具编写1.mp4|课时1 Android 加壳原理.mp4|课时3 快速Hook代码搭建之 Xposed.mp4|课时2 快速Hook代码搭建之 Cydia Substrate.mp4 参考技术A 不要把分丢掉。扔这里吧
a284978383你好,
给你推荐一款在线 金达_屏幕录像专家 (软件请百度搜索),金达是一款完全基于Web浏览器的网页版屏幕录像专家。它能够在线录制你的电脑屏幕操作视频,并可即时发布到金达网分享。你还可以设置预览一段时间后必须支付金币才能继续观看,以获得分成收入。
使用金达屏幕录像专家,你无需下载安装(需要Java虚拟机的支持),便可以很轻松的在线录制视频教程,支持Windows和Mac系统,支持麦克风声音录入、区域录制等,值得一提的是,金达录制的视频质量非常高,并且可以导出到本地保存。
金达网目前已经有网友发布了成千上万的各种视频教程,无论是新手上网、办公应用,还是PS图片、网站编程等,
很不错哦,你可以试下~·完全免费的·~~·还能赚钱·~~
小知识:
扬汤止沸:把锅里开着的水舀起来再倒回去,使它凉下来不沸腾。比喻办法不彻底,不能从根本上解决问题。 参考技术B 百度网页搜索:视频转换大师专业版
把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA;
把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB;
把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264;
把各种视频格式转换成SWF、FLV、GIF、MOV;
支持读取DVD光盘, 以及合并视频文件转到任意格式;
从各种视频中抽取各种音频(mp3/wav/wma/ac3/ogg/mmf/aac等);及音频间互相转换;追问
需要用代码实现,不是用软件转换·
参考技术C 。。。。。。。。。。。。。。。俩二B以上是关于iOS视频推流格式转换的主要内容,如果未能解决你的问题,请参考以下文章