在尝试修复简单的视频录制应用程序*时,我遇到了一些问题.我想我正确地遵循了一系列步骤.以下是对我提出问题的代码部分的简化.按下按钮后,此代码仅作为回调执行:
if ( mRecorder != null){
mRecorder.reset();
mRecorder.release();
}
mRecorder = new MediaRecorder();
if(mViewer.hasSurface){
mRecorder.setPreviewDisplay(mViewer.holder.getSurface());
Log.d(TAG,"Surface has been set");
}
try {
Log.d(TAG,"Sleeping for 4000 mili");
Thread.sleep(4000);
Log.d(TAG,"Waking up");
} catch (InterruptedException e) {
Log.e(TAG,"InterruptedException");
e.printStackTrace();
}
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setVideoFrameRate(12);
mRecorder.setVideoSize(176, 144);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setMaxDuration(MAX_DURATION_TEST);
String targetFile = "/sdcard/webcamera/temp.mp4";
File localFile = new File(targetFile);
if(localFile.exists()){
Log.d(TAG,"Local file exists");
}else{
Log.d(TAG,"Local file does not exist");
}
mRecorder.setOutputFile(targetFile);
try {
mRecorder.prepare();
bPrepared = true;
Log.i(TAG,"prepared");
return;
} catch (IllegalStateException e) { …Run Code Online (Sandbox Code Playgroud) 我想结合两个mp4视频,使用ffmpeg形成一个mp4视频.
到目前为止我尝试过的是
ffmpeg -i input1.mp4 -i input2.mp4 output.mp4
Run Code Online (Sandbox Code Playgroud)
但是,每次我使用第一个输入的视频编解码器获取视频而不是另一个.我该如何结合它们?任何想法都将受到高度赞赏.
我正在寻找最佳方式(如果有的话)将连续视频捕获到SD卡上的循环缓冲区,允许用户在事件发生后捕获事件.
标准视频录制API允许您直接写入文件,当您达到限制(由用户设置或SD卡的容量)时,您必须停止并重新开始录制.这将创建长达2秒的长窗口,其中录制未运行.这就是DailyRoads Voyager等现有应用已经做过的事情.为了最大限度地减少丢失重要事物的可能性,你可以将分裂时间设置为很长的时间,比如10分钟,但是如果事件发生在接近这个时间跨度的末尾,你就会在开始时存储9分钟的空间而浪费空间.
所以,我现在的想法如下:我将有一个大文件作为缓冲区.我将使用我发现的一些代码来捕获帧并将它们保存到文件中,最后包裹.当用户想要保留一些部分时,我会通过指向缓冲区的开头和结尾的标记来标记它.录制可以像以前一样继续,跳过标记为保留的区域.
录制停止后,或者在后台线程中(取决于手机/卡的速度),我会将标记的区域复制到另一个文件并删除覆盖保护.
主要问题,如果您不关心上述细节:我似乎无法找到将各个帧转换为Android SDK中的视频文件的方法.可能吗?如果没有,是否有任何可用的库,可能是本机代码,可以做到这一点?
我并不关心未压缩帧的大缓冲区,但导出的视频应该以Android友好的格式压缩.但是,如果有一种压缩缓冲区的方法,我想听听它.
谢谢.
android video-capture continuous circular-buffer video-encoding
我正在研究Android(2.2)应用程序/服务的开发,这将使用户能够在他们的手机上录制短片(我强调短片,<30秒),然后将该视频(HTTP)上传到服务器,然后转码视频到其他格式.该用户可以从其他Android用户下载视频并播放它们.
现在,我对每个人推荐的方法都有点失落,因为我没有在一个有凝聚力的环境中看到任何问题.理想情况下,我想要一个非商业解决方案(因为视频托管/转码不需要供应商/服务),但是,随意将这些作为推荐(我将其标记为维基),因为我知道很多人喜欢在这一切中使用youtube和vimeo作为中间层.
问题是
一些可能对你有帮助的事情......
我们已经决定是时候放弃在我们的网站属性上部署视频的临时方法,并选择一个或多个视频平台来为我们处理这项任务.高级要求是:
其他一些可能会使平衡倾斜的事情:
自己托管不是一种选择 - 我们只是没有人力来照顾/喂养它.价格不是主要对象.
那么,你会选谁?
有谁知道C#(或任何其他托管语言)的开源H.264编码器?我也许可以使用python实现.
我发现的库(例如x264)是用非常低级别的c(用大量宏程序编写)和汇编编写的.调整它们的结果远比我想象的要复杂得多.我的项目不关心性能或兼容性.我们只想测试一些想法会如何影响输出视频的感知.
如果需要,我们愿意为代码付费或许可.
提前致谢!
编辑 - 一些要点:
我有一些H.264编码的视频,它们在Web浏览器中正确呈现HTML5,但无法在iPad上正确呈现.当我使用从互联网上下载的H.264视频时,我的视频在iPad上正确呈现,因此它不是HTML问题.
这是关于我的视频的ffmpeg信息 -
我原来的.mov视频:
似乎流1编解码器帧速率与容器帧速率不同:6000.00(6000/1) - > 30.00(30/1)
从'a_video.mp4'输入#0,mov,mp4,m4a,3gp,3g2,mj2:
元数据:
Run Code Online (Sandbox Code Playgroud)major_brand : qt minor_version : 537199360 compatible_brands: qt持续时间:00:00:42.74,开始:0.000000,比特率:220 kb/s
Run Code Online (Sandbox Code Playgroud)Stream #0.0(eng): Audio: aac, 44100 Hz, stereo, s16, 94 kb/s Stream #0.1(eng): Video: h264, yuv420p, 762x464, 122 kb/s, 30 fps, 30 tbr, 3k tbn, 6k tbc
使用Handbrake将我的.mov转换为mp4后,却无法在iPad上渲染:
似乎流0编解码器帧速率与容器帧速率不同:180000.00(180000/1) - > 29.97(30000/1001)
从'a_video.m4v'输入#0,mov,mp4,m4a,3gp,3g2,mj2:
元数据:
Run Code Online (Sandbox Code Playgroud)major_brand : mp42 minor_version : 0 compatible_brands: mp42isomavc1 encoder: HandBrake 0.9.5 2011010300持续时间:00:00:42.77,开始:0.000000,比特率:169 kb/s
流#0.0(UND):视频:H264,YUV420P,752x464 [PAR 381:376 DAR 381:232],35 kb/s的,PAR 145161:141376 DAR 145161:87232,29.97,29.97 TBR,90K TBN,180K TBC
流#0.1(eng):音频:aac,44100 …
GStreamer的文档令人困惑.这仍然是诉诸StackOverflow.com的借口,但仍然是:
什么是将任何视频文件(从任何格式)转换为WebM(+ WebM音频)的GStreamer命令行?
我被困在某个地方 gst-launch-0.10 webmmux name=mux ! filesrc location=oldfile.ext ! filesink location=newfile.webm ! name=demux ! demux. ! ffmpegcolorspace ! vp8enc ! queue ! mux.video_0 ! demux. ! progressreport ! audioconvert ! audiorate ! vorbisenc ! queue ! mux.audio_0
我WARNING: erroneous pipeline: link without source element知道如何让这件事情继续下去.
这非常令人沮丧.
请帮忙,谢谢.:)
我有一个mp4格式的电视片段,包含音频和视频,以及一个WAV audio_commentary轨道.
我一直在尝试将它们组合在ffmpeg中,然后使用flash播放器在线播放(只能采用h264格式)
完成此任务的最佳ffmpeg命令是什么?我的输入是MP4视频,WAV音频和以秒为单位的偏移量,音频评论开始的时间相对于mp4视频的开始.
我试过了
ffmpeg -i input_audio.wav -i input_vid.mp4 -vcodec copy output.mp4
Run Code Online (Sandbox Code Playgroud)
和
ffmpeg -vcodec copy -ss offset -i input_audio.wav -i input_video.mp4 output.mp4
Run Code Online (Sandbox Code Playgroud)
下面这些做我想做的事情并以h264格式输出对闪存播放器有利的视频 - 有没有办法在ffmpeg中从命令行执行此操作?
我有一个屏幕录制应用程序,它使用MediaCodec编码器对视频帧进行编码.这是我检索视频编码器的一种方法:
videoCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
Run Code Online (Sandbox Code Playgroud)
然后我尝试确定此编码器支持的最佳比特率模式,我的优先顺序是"恒定质量"模式,可变比特率模式,恒定比特率模式.这是我尝试这样做的方式:
MediaCodecInfo.CodecCapabilities capabilities = videoCodec.getCodecInfo().getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_AVC);
MediaCodecInfo.EncoderCapabilities encoderCapabilities = capabilities.getEncoderCapabilities();
if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ)) {
Timber.i("Setting bitrate mode to constant quality");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR)) {
Timber.w("Setting bitrate mode to variable bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR);
} else if (encoderCapabilities.isBitrateModeSupported(MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR)) {
Timber.w("Setting bitrate mode to constant bitrate");
videoFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR);
}
Run Code Online (Sandbox Code Playgroud)
在我的三星Galaxy S7上运行它最终选择VBR模式,即据说不支持恒定质量模式.但是,如果我只是将BITRATE_MODE设置为恒定质量,它不仅可以工作,而且实际上可以产生比VBR模式更高质量的视频.
因此,如果此编码器显然支持恒定质量模式,为什么我会从isBitrateModeSupported()获得误报?我在这里错过了什么吗?