精华内容
下载资源
问答
  • 音频合并

    2021-04-01 16:22:38
    1.音频合并,取视频1的是视频,视频2的音频合成一个新的视频 int videoIndex = -1; int audioIndex = -1; try { mediaExtractor.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/ss/" + ...

    1.音频合并,取视频1的是视频,视频2的音频合成一个新的视频
    MediaExtractor作用是将视频分离
    MediaMuxer作用是将音频和视频合成新的音频

    MediaExtractor步骤:

    1.设置数据源

                mediaExtractor.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/ss/" + "2.mp4");
    
    

    2.获取通道数,切换到想要的轨道

     int trackCount = mediaExtractor.getTrackCount();
                for (int i = 0; i < trackCount; i++) {
                    MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
                    String mimeType = trackFormat.getString(MediaFormat.KEY_MIME);
                    // 取出视频的信号
                    if (mimeType.startsWith("video/")) {
                        videoIndex = i;
    
                    }
                    if (mimeType.startsWith("audio/")) {
                        audioIndex = i;
    
                    }
    
                }
    

    3.循环读取每帧的样本数据

        while (true) {
                    //读取帧之间的数据
                    int readSampleSize = mediaExtractor.readSampleData(byteBuffer_video, 0);
                    if (readSampleSize < 0) {
                        break;
                    }
                    mediaExtractor.advance();
                    bufferInfo_video.size = readSampleSize;
                    bufferInfo_video.offset = 0;
                    bufferInfo_video.flags = mediaExtractor.getSampleFlags();
                    bufferInfo_video.presentationTimeUs += videoSampleTime;
                }
    

    4.完成后释放资源

      mediaExtractor.release();
    
    

    MediaMuxer步骤:

    1.设置目标文件路径和音视频格式

    mediaMuxer = new MediaMuxer(SDCARD_PATH + "/output_video55.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
    

    2.添加要合成的轨道,包括音轨和视轨

    mediaMuxer.addTrack(trackFormat_audio);
    

    3.开始合成,循环写入每帧样本数据

    mediaMuxer.writeSampleData(trackIndex_video, byteBuffer_video, bufferInfo_video);
    
    

    4.完成后释放资源

    mediaMuxer.release();
    
        int videoIndex = -1;
            int audioIndex = -1;
            try {
                mediaExtractor.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/ss/" + "2.mp4");
                int trackCount = mediaExtractor.getTrackCount();
                for (int i = 0; i < trackCount; i++) {
                    MediaFormat trackFormat = mediaExtractor.getTrackFormat(i);
                    String mimeType = trackFormat.getString(MediaFormat.KEY_MIME);
                    // 取出视频的信号
                    if (mimeType.startsWith("video/")) {
                        videoIndex = i;
    
                    }
          
    
                }
                mediaExtractoraudio.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/ss/" + "tt.mp4");
                int trackCount2 = mediaExtractoraudio.getTrackCount();
                for (int i = 0; i < trackCount2; i++) {
                    MediaFormat trackFormat = mediaExtractoraudio.getTrackFormat(i);
                    String mimeType = trackFormat.getString(MediaFormat.KEY_MIME);
                    // 取出视频的信号
                    if (mimeType.startsWith("audio/")) {
                        audioIndex = i;
                    }
    
                }
                //切换道视频信号的信道
                mediaExtractor.selectTrack(videoIndex);
                MediaFormat trackFormat_video = mediaExtractor.getTrackFormat(videoIndex);
    
                mediaExtractoraudio.selectTrack(audioIndex);
                MediaFormat trackFormat_audio = mediaExtractoraudio.getTrackFormat(audioIndex);
    
    
                mediaMuxer = new MediaMuxer(SDCARD_PATH + "/output_video55.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
                //追踪此信道
                int trackIndex_video = mediaMuxer.addTrack(trackFormat_video);
                int trackIndex_audio= mediaMuxer.addTrack(trackFormat_audio);
    
                ByteBuffer byteBuffer_video = ByteBuffer.allocate(1024 * 500);
                ByteBuffer byteBuffer_audio = ByteBuffer.allocate(500 * 1024);
    
                MediaCodec.BufferInfo bufferInfo_video = new MediaCodec.BufferInfo();
                MediaCodec.BufferInfo bufferInfo_audio = new MediaCodec.BufferInfo();
    
    
                mediaMuxer.start();
                long videoSampleTime;
                //获取每帧的之间的时间
                {
                    mediaExtractor.readSampleData(byteBuffer_video, 0);
                    //skip first I frame
                    if (mediaExtractor.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC)
                        mediaExtractor.advance();
                    mediaExtractor.readSampleData(byteBuffer_video, 0);
                    long firstVideoPTS = mediaExtractor.getSampleTime();
                    mediaExtractor.advance();
                    mediaExtractor.readSampleData(byteBuffer_video, 0);
                    long SecondVideoPTS = mediaExtractor.getSampleTime();
                    videoSampleTime = Math.abs(SecondVideoPTS - firstVideoPTS);
                    Log.d("dimen", "videoSampleTime is " + videoSampleTime);
                    Log.d("TAG", "SeparateVideo3:====bufferInfo_audio "+videoSampleTime);
    
                }
                //重新切换此信道,不然上面跳过了3帧,造成前面的帧数模糊
                mediaExtractor.unselectTrack(videoIndex);
                mediaExtractor.selectTrack(videoIndex);
                while (true) {
                    //读取帧之间的数据
                    int readSampleSize = mediaExtractor.readSampleData(byteBuffer_video, 0);
                    if (readSampleSize < 0) {
                        break;
                    }
                    mediaExtractor.advance();
                    bufferInfo_video.size = readSampleSize;
                    bufferInfo_video.offset = 0;
                    bufferInfo_video.flags = mediaExtractor.getSampleFlags();
                    bufferInfo_video.presentationTimeUs += videoSampleTime;
                   // Log.d("TAG", "SeparateVideo3:====video "+ bufferInfo_video.presentationTimeUs);
    
                    //写入帧的数据
                    mediaMuxer.writeSampleData(trackIndex_video, byteBuffer_video, bufferInfo_video);
                }
    
                long stampTime = 0;
                //获取帧之间的间隔时间
                {
                    mediaExtractoraudio.readSampleData(byteBuffer_audio, 0);
                    if (mediaExtractoraudio.getSampleFlags() == MediaExtractor.SAMPLE_FLAG_SYNC) {
                        mediaExtractoraudio.advance();
                    }
                    mediaExtractoraudio.readSampleData(byteBuffer_audio, 0);
                    long secondTime = mediaExtractoraudio.getSampleTime();
                    mediaExtractoraudio.advance();
                    mediaExtractoraudio.readSampleData(byteBuffer_audio, 0);
                    long thirdTime = mediaExtractoraudio.getSampleTime();
                    stampTime = Math.abs(thirdTime - secondTime);
                    Log.d("TAG", "SeparateVideo3:====bufferInfo_audio "+stampTime);
    
                }
    
                //写入音频  ===音频长度刚好小于等于视频长度则写入数据
                while (bufferInfo_audio.presentationTimeUs <=bufferInfo_video.presentationTimeUs){
                    mediaExtractoraudio.unselectTrack(audioIndex);
                    mediaExtractoraudio.selectTrack(audioIndex);
                    while (true) {
                        int readSampleSize = mediaExtractoraudio.readSampleData(byteBuffer_audio, 0);
                        if (readSampleSize < 0) {
                            break;
                        }
                        mediaExtractoraudio.advance();
                        bufferInfo_audio.size = readSampleSize;
                        bufferInfo_audio.flags = mediaExtractoraudio.getSampleFlags();
                        bufferInfo_audio.offset = 0;
                        bufferInfo_audio.presentationTimeUs += stampTime;
                        if (bufferInfo_audio.presentationTimeUs <=bufferInfo_video.presentationTimeUs){
                            mediaMuxer.writeSampleData(trackIndex_audio, byteBuffer_audio, bufferInfo_audio);
    
                        }
                    }
                }
    
    
    
    
                    //release
                mediaMuxer.stop();
                mediaExtractor.release();
                mediaExtractoraudio.release();
    
                mediaMuxer.release();
    
                Log.e("dimen", "finish");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    展开全文
  • QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物...

    在这里插入图片描述


    QQ 1274510382
    Wechat JNZ_aming
    商业联盟 QQ群538250800
    技术搞事 QQ群599020441
    解决方案 QQ群152889761
    加入我们 QQ群649347320
    共享学习 QQ群674240731
    纪年科技aming
    网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。


    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    展开全文
  • ffmpeg视音频处理工具

    2020-03-12 10:53:28
    FFmpeg是一套对视频,音频进行格式化,转码,内容编辑,合并等操作的工具. ffmpeg官网 http://ffmpeg.org/ ffmpeg对各大操作系统均有支持,github上中有其对应的源码,也可以直接下载编译后的工具使用 下载后将文件...
    • FFmpeg是一套对视频,音频进行格式化,转码,内容编辑,合并等操作的工具.
    • ffmpeg官网
    http://ffmpeg.org/
    
    • ffmpeg对各大操作系统均有支持,github上中有其对应的源码,也可以直接下载编译后的工具使用

    在这里插入图片描述

    • 下载后将文件解压得到以下文件,其中bin目录下为所有ffmpeg可以行文件工具

    在这里插入图片描述

    • 示例:为视频添加背景音乐

    • 命令格式,windows下需要加上.exe后缀

    ffmpeg.exe -i 视频文件所在目录 -i 背景音乐所在目录 -t 输出视频时长 -y  输出文件路径
    
    • 文件所在目录地址可以是相对路径,也可以是绝对路径
    • 参数说明
    参数说明
    -i输入源
    -t时长
    -y是否覆盖同名文件
    • 在bin目录下放一个测试视频文件

    在这里插入图片描述

    • 然后打开cmd命令行,输入以下命令,最后的输出文件名为 reset.mp4,视频时长为10秒
    ffmpeg.exe -i test.mp4 -i E:\6.music\1.colud-music\花粥_在山河的角落里唱给你听.mp3 -t 10 reset.mp4
    
    • 执行命令后命令行会出现以下内容

    在这里插入图片描述

    • 最后在bin目录下会得到rest.mp4文件,打开播放后会得到一个时长为10秒有背景音乐的视频

    在这里插入图片描述

    • 示例:截取视频中某一秒的图片
    • 命令
    ffmpeg.exe -ss 时间表达式 -y -i 目标视频路径 -vframes 1 视频输出地址
    
    • 参数说明
    参数说明
    -ss时间段表达式,例如 00:00:01 表示为视频第一秒
    -y是否覆盖同名文件
    i输入源
    vframes视频帧数
    • 截取一个视频文件的第一秒图片
    ffmpeg.exe -ss 00:00:01 -y -i test.mp4 -vframes 1 s.jpg
    

    在这里插入图片描述

    在Java中使用ffmpeg

    • 在java程序中可以执行cmd命令行工具,需要使用到 ProcessBuilder 工具类
    • 具体使用如下
    // 可执行命令进程
    ProcessBuilder processBuilder = new ProcessBuilder();
    
    // 设置执行命令
    List<String> command = new ArrayList<>();
    command.add("ipconfig"); // 查看ip地址命令
    processBuilder.command(command);
    
    // 执行命令
    Process start = processBuilder.start();
    // 获取输入流
    InputStream inputStream = start.getInputStream();
    
    // 打印输入流信息
    String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
    System.out.println(string);
    
    • 运行代码控制台打印以下内容

    在这里插入图片描述

    示例:使用java程序调用ffmpeg,合并视频与音频文件

     // 可执行命令进程
            ProcessBuilder processBuilder = new ProcessBuilder();
    
            // 设置执行命令
            List<String> command = new ArrayList<>();
    
            // 可执行文件路径
            String ffmpeg_exe = "D:\\1.dev-office\\19.ffmpeg\\ffmpeg\\bin\\ffmpeg.exe";
            command.add(ffmpeg_exe);
    
            // 命令参数
           command.add("-i");
    
            // 视频文件路径
            String videoPath = "E:\\9.vedio\\test.mp4";
            command.add(videoPath);
    
            command.add("-i");
            // 音频文件路径
            String audioPath = "E:\\6.music\\1.colud-music\\花粥_在山河的角落里唱给你听.mp3";
            command.add(audioPath);
            // 格式化后视频输出路径
            String outVideoPath = "E:\\9.vedio\\outVideoPath.mp4";
            command.add(outVideoPath);
    
            for (String str: command){
                System.out.print(str + " ");
            }
    
            processBuilder.command(command);
            // 执行命令
            Process start = processBuilder.start();
    
            // 得到输入流
            InputStream inputStream = start.getInputStream();
           // String string = StreamUtils.copyToString(inputStream, Charset.forName("GBK"));
    
            OutputStream outputStream = start.getOutputStream();
            InputStream errorStream = start.getErrorStream();
    
            // 关闭流
            if(inputStream != null){
                inputStream.close();
            }
            if(outputStream != null){
                outputStream.close();
            }
    
            if(errorStream != null){
                errorStream.close();
            }
            // 打印执行命令后的内容
            //System.out.println(string);
    
    • 得到以下新文件

    在这里插入图片描述

    展开全文
  • iOS视音频实用Demo

    2018-07-07 15:41:56
    可自由选择你需要的 parameters 合并和导出视频。 Cool-iOS-Camera - Cool-iOS-Camera。 FastttCamera - FastttCamera 快速照相。 ICGVideoTrimmer - ICGVideoTrimmer提供提供视频剪切的视图(类似系统相册中浏览...

    图像浏览及处理

    • FLAnimatedImage - gif播放处理的工具。
    • CLImageEditor - 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情。
    • ios-image-filters - 图像滤镜,库比较旧了,很容易崩溃。
    • XBImageFilters - 图像滤镜。
    • MWPhotoBrowser - 一个非常不错的照片浏览器,在github的star接近3000个,解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题。
    • core-image-explorer - Core Image 滤镜处理图片-- swift ,Core Image 介绍
    • CoreImageShop - CoreImageShop图片滤镜处理-- Mac app that let you create a complete Core Image Filter usable on iOS using SCRecorder。
    • GPUImage - 处理图片效果。
    • GPUImage2.swift - Swift 版基于 GPU 图像和视频处理框架库。
    • RSKImageCropper - 适用于iOS的图片裁剪器,类似Contacts app,可上下左右移动图片选取最合适的区域。
    • WZRecyclePhotoStackView - 删除照片交互--WZRecyclePhotoStackView,就是模拟生活中是删除或保留犹豫不决的情形而产生的。 在上滑,下滑的部分,借鉴了TinderSimpleSwipeCards
    • TimingFunctionEditor - TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器。 Carthage ,而非常用的 CocoaPods。Carthage介绍中文
    • AAFaceDetection - AAFaceDetection--swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。
    • PhotoTweaks - 这个库挺赞的,正好是对图像操作的。
    • Concorde - swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。
    • ZoomTransition - swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。
    • AFImageHelper - swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。
    • PinterestSwift - swift,Pinterest 风格图片缩放、切换示例。
    • KYElegantPhotoGallery - 一个优雅的图片浏览库。
    • SDPhotoBrowser - 仿新浪动感图片浏览器,非常简单易用的图片浏览器,模仿微博图片浏览器动感效果,综合了图片展示和存储等多项功能。
    • HZPhotoBrowser - 一个类似于新浪微博图片浏览器的框架(支持显示和隐藏动画;支持双击缩放,手势放大缩小;支持图片存储;支持网络加载gif图片,长图滚动浏览;支持横竖屏显示)。
    • PhotoStackView-Swift - PhotoStackView——照片叠放视图,使用说明
    • MarkingMenu - 基于手势、类似 Autodesk Maya 风格标记菜单及图片渲染。
    • SXPhotoShow - UICollectionViewFlowLayout流水布局 是当下collectionView中常用且普通的布局方式。本代码也写了三种好看的布局,其中LineLayout和流水布局有很大的相同点就直接继承UICollectionViewFlowLayout,然后StackLayout,CircleLayout这两种都是直接继承自最原始的UICollectionViewLayout 布局方案。
    • PictureWatermark - 主要实现了给图片加文字以及图片水印的功能,已封装成了UIImage的类别,方便使用。
    • 自定义宽高比的相册框 拍照 - 取出照片时 弹出自定义view。在这个自定义view上创建一个需要的相框大小的view层 把取出的图片赋值给UIImageView按缩放添加到这个层上。对uiimageView添加捏合、移动 手势。添加按钮 选取,最后根据位移和缩放比例 裁剪image。
    • LGPhotoBrowser - LGPhotoBrowser:相册选择/浏览器/照相机(仿微信),包含三个模块:照片浏览器,相册选择器,照相机。
    • PhotoBrowser - 一个简单的好用的的图片浏览器。
    • BeautyHour - 完整应用,功能与“美图秀秀”雷同。
    • MPParallaxView - 是用 Swift 写的类似 Apple TV Parallax 效果的视图。
    • StitchingImage - 仿微信群组封面拼接控件, 直接拖进项目就可使用,教程
    • SDECollectionViewAlbumTransition - 用自定义的 push 和 pop 实现了有趣的 iOS 相册翻开动画效果。
    • SKPhotoBrowser.swift - swift中规中矩、实用的图片浏览类库。示例也很完整。
    • Nuke.swift - 完整、强大、实用的图片管理类库。主要功能包括可定制装载,缓存,滤镜及尺寸变换。
    • DNImagePicker - 类似wechat的图片选择。
    • CocoaPicker - 仿QQ图片选择器(OC)。
    • JFImagePickerController - vvebo作者:多选照片、预览已选照片、针对超大图片优化。
    • VIPhotoView - 图片浏览,用于展示图片的工具类,因为是个 View,所以你可以放在任何地方显示。支持旋转,双击指定位置放大等。
    • AGImagePickerController - 是一个图片选择器,支持图片多选,支持大图横滑预览,支持放大预览,支持横竖屏,支持所有的iOS设备。
    • YYImage - 功能强大的 iOS 图像框架,支持大部分动画图像、静态图像的播放/编码/解码。
    • PagingView.swift - 注重细节的自动布局分页视图组件。
    • TZImagePickerController - 一个支持多选、选原图和视频的图片选择器,同时有预览功能,适配了iOS6789系统。教程.
    • 更换头像 - 用户选取从相机或者相册获取图片,并且显示在View上。
    • DouBanMeinv.swift - 抓取豆瓣美女图片,瀑布流显示。
    • ZZPhotoKit - 基于Photos和AVFoundation框架开源,相册多选与相机连拍。
    • SwViewCapture.swift - SwViewCapture.swift一个用起来还不错的iOS截图库.(支持截取所有内容, 适用于所有ScrollView组成的视图, 包括WebView)。
    • BeautifyFaceDemo - 一个基于 GPUImage 的实时直播磨皮滤镜的开源实现,主要功能脸部去斑磨皮!
    • YUCIHighPassSkinSmoothing - 磨皮滤镜!
    • Filterpedia.swift - 强大的图片滤镜库演示。
    • YUGPUImageHighPassSkinSmoothing - 一个基于 GPUImage 的磨皮滤镜!
    • preview-transition.swift - 通过向导式代码实现步骤,实现完整、自然流畅的图片预览及转场功能。
    • CartoonEyes.swift - 前置摄像头捕获图像后,采用 Core Image 脸部识别 CIDetector 和漫画效果滤镜复合出卡通效果眼睛。
    • YLFaceuDemo - 在直播应用中添加Faceu贴纸效果。Faceu贴纸效果其实就是在人脸上贴一些图片,同时这些图片是跟随着人脸的位置改变的。说明

    ========

    摄像照相视频音频处理

    • SCRecorder - SCRecorder 短视频录制。
    • VideoPushDemo - 视频剪辑 视频特效制作1 视频特效制作2
    • LLSimpleCamera - A simple, customizable camera control for iOS, 摄像头。
    • EZAudio - EZAudio 是一个 iOS 和 OSX 上简单易用的音频框架,根据音量实时显示波形图,基于Core Audio,适合实时低延迟音频处理,非常直观。中文介绍,官网
    • ffmpeg - ffmpeg官网,FFmpeg在iOS上完美编译
    • VLC - VCL官网,VLC for iOS 2.7.2 source code
    • kxmovie - 使用ffmpeg的影片播放器,修改说明修改代码基于FFmpeg的kxMoive艰难的编译运行
    • ijkplayer - B站开源的视频播放器,支持Android和iOS。 iOS中集成ijkplayer视频直播框架
    • StreamingKit - StreamingKit流媒体音乐播放器。
    • FreeStreamer - FreeStreamer流媒体音乐播放器,cpu占用非常小。
    • DOUAudioStreamer - DOUAudioStreamer豆瓣的音乐流媒体播放器。
    • fmpro - 电台播放器,支持锁屏歌词,支持基本播放流程,歌词展示,后台锁屏播放和控制以及锁屏后封面+歌词,fmpro_R
    • IPDFCameraViewController - 支持相机定焦拍摄、滤镜、闪光、实时边框检测以及透视矫正功能,并有简单易用的API。
    • SCRecorder - 酷似 Instagram/Vine 的音频/视频摄像记录器,以 Objective-C 为基础的过滤器框架。 你可以做很多如下的操作:记录多个视频录像片段。删除任何你不想要的记录段。可以使用任何视频播放器播放片段。保存的记录可以在序列化的 NSDictionary 中使用。(在 NSUserDefaults 的中操作)添加使用 Core Image 的视频滤波器。可自由选择你需要的 parameters 合并和导出视频。
    • Cool-iOS-Camera - Cool-iOS-Camera。
    • FastttCamera - FastttCamera 快速照相。
    • ICGVideoTrimmer - ICGVideoTrimmer提供提供视频剪切的视图(类似系统相册中浏览视频时顶部那个条状视图)。左右两个边界选择器还能够自定义。
    • IOS录音和播放功能demo - 比较完整的ios录音和播放功能的实现。
    • CameraManager - 相机管理封装类库。看着极好用的样子----swift。
    • MCAudioInputQueue - 简易录音类,基于AudioQueue的。
    • DraggableYoutubeFloatingVideo - 展示像类似Youtube移动应用的那种浏览视频的效果,当点击某视频时能够从右下方弹出一个界面,并且该界面能够通过手势,再次收缩在右下方并继续播放。这是通过AutoLayout设计实现。
    • amr - 做即时通讯的音频处理,录音文件是m4a,便于web端的音频播放。
    • 边录音边转码 - 一边录音,一边将录制成的 wav 格式音频文件转码成 amr 音频格式。只支持真机运行调试。
    • FSVoiceBubble - 一个轻量级播放录音音频的气泡:1.支持短时间的音频播放(支持网络音频);2.播放时的声波动画;3.自定义包括声波的颜色,气泡的背景等。
    • KRVideoPlayer - 类似Weico的播放器,支持竖屏模式下全屏播放。
    • 自定义视频播放器AVPlayer - 利用系统类AVPlayer实现完全自定义视频播放器,显示播放时间,缓存等功能。代码清晰,注释详细。
    • VideoBeautify - 功能酷似美拍,秒拍等应用的源码:对视频进行各种美化处理,采用主题形式进行分类,内含各种滤镜,动画特效和音效等。
    • HTY360Player - 是一款提供在 iOS 中使用 360 度无死角拖拽视频进行不同角度播放的视频播放器。
    • ALCameraViewController - ALCameraViewController 摄像头视图控制器(含可定制照片选择器,图片简单裁切功能)及演示。
    • recordDemo.swift - 一个Swift语言实现直接可以用的录音Demo,实现说明
    • Swift-Radio-Pro - 集成 LastFM 的专业电台应用(基于 Swift 2.0)。
    • Eleven - Eleven Player - 一个使用 FFmpeg 实现的简单强大的 iOS 开源播放器。
    • mobileplayer-ios.swift - 很不错的高度可定制播放器项目。
    • iFrameExtractor - 开源视频播放器, ffmpeg在iOS的使用-iFrameExtractor源码解析,文章
    • Periscope-VideoViewController.swift - 简洁实用的视频快进、倒带控制视图类库。
    • AudioKit.swift - 音频合成、加工及分析平台(支持 iOS、OS X、tvOS)框架库。无论其易用性,还是功能性及专业性。
    • MusicPlayert - MusicPlayert本地音乐播放+音乐信息显示+在线歌词搜索显示(千千静听服务器)。
    • MusicPlayert - MusicPlayert音乐播放器,用reveal可以查看层次关系,主要实现了歌词的同步显示。
    • 音乐播放器 - 音乐播放器:显示歌词。
    • TBPlayer - 视频变下变播,把播放器播放过的数据流缓存到本地,支持拖动。采用avplayer。实现说明
    • WMPlayer - WMPlayer视频播放器,AVPlayer的封装,继承UIView,想怎么玩就怎么玩。支持播放mp4、m3u8、3gp、mov,网络和本地视频同时支持。全屏和小屏播放同时支持。 cell中播放视频,全屏小屏切换自如。
    • IWatch - 一个视频日报类的app 播放器用到了AVFoudation。
    • SkfSwiftCammer - 一个相机demo,在oc里面调用了swift。
    • ZFPlayer - 基于AVPlayer,支持横屏、竖屏(全屏播放还可锁定屏幕方向),上下滑动调节音量、屏幕亮度,左右滑动调节播放进度。
    • BMPlayer.swift - 基于 AVPlayer 使用 Swift 封装的视频播放器,方便快速集成,支持横屏、竖屏,上下滑动调节音量、屏幕亮度,左右滑动调节播放进度。


    作者:小兵快跑
    链接:https://www.jianshu.com/p/9b788285b982
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
    展开全文
  • 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例2:GDI播放YUV, RGB 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放示例4:...
  • 视音频复用器(Muxer)即是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。如图所示。在这个过程中并不涉及到编码和解码。 本文记录的程序将一个H.26
  • 整理了一些基本视音频术语,用于入门和查询使用。 H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPEG-4第10部分,或称AVC(AdvancedVideo Coding,高级视频编码),...
  • =====================================================最简单的视音频播放演示样例系列文章列表:最简单的视音频播放演示样例1:总述最简单的视音频播放演示样例2:GDI播放YUV, RGB最简单的视音频播放演示样例3:...
  • 将MP4视频和MP4音频合并成MP4文件

    千次阅读 2019-08-24 18:20:36
    由于项目需要,需要将一个mp4文件中的视频和另一个mp4文件的音频合成为一个mp4文件。因此试着将合成的思路记录下来,以便以后进行查看。 合成中需要处理的问题: 1.当视频和音频时长不一致时,如何处理? 以视频...
  • 最简单的视音频播放示例7 SDL2播放RGB/YUV
  • 随着5G、AI、VR等ICT基础能力的完善,万物互联、万物智联已成趋势,终端设备接入会呈现几何级的增长,实时通信不再局限人与人之间,还存在于人与设备之间,视音频通信与生产系统整合后,改善现...
  • 摘要: 整理了一些基本视音频术语,用于入门和查询使用。 H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPEG-4第10部分,或称AVC(AdvancedVideo Coding,高级视频编码...
  • =====================================================最简单的视音频播放演示样例系列文章列表:最简单的视音频播放演示样例1:总述最简单的视音频播放演示样例2:GDI播放YUV, RGB最简单的视音频播放演示样例3:...
  •  视音频编辑中,对多段媒体素材进行截取和拼接是非常常见的操作。截取和拼接实际上是对媒体文件数据重新进行组合的过程。  要实现这些功能,就需要对媒体文件进行编解码操作,即先解码要处理的媒体文件数据,...
  • 数字视音频处理知识点小结

    千次阅读 2017-01-06 01:29:25
     编码时,从最小概率两个符号开始,其中一个支路为0,另一个为1,再把两支路合并,重复以上操作。 Run-length编码的具体方法  (X,Y) , X代表数字,Y代表出现了几次 运动补偿中子块匹配...
  • 最简单的视音频播放示例3 Direct3D播放YUV,RGB(通过Surface)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,858
精华内容 2,343
关键字:

视音频合并