小编Nek*_*esh的帖子

使用MediaCodec和MediaMuxer对视频进行编码和复用

我正在开发一个应用程序,我解码视频并替换某些帧并使用MediaMuxer和重新编码MediaCodec.如果我不替换任何帧(除了1080p视频,我将在下面解释),该应用程序可以工作,但是当我这样做时,替换后的帧会像素化,视频会不稳定.

此外,当我尝试使用1920x1080视频的应用程序时,我得到一个奇怪的输出,其中视频没有显示任何内容,直到我滚动到视频的开头,然后视频开始显示(但具有之前提到的相同问题)编辑后的像素化.

以下是我配置编码器的方法:

Video_format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, interval);
Video_format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
Video_format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
Video_format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
int color_format=MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar;
Video_format.setInteger(MediaFormat.KEY_COLOR_FORMAT, color_format);

encoder.configure(Video_format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Run Code Online (Sandbox Code Playgroud)

总而言之,我有两个问题:

1-修改帧后的像素化帧和不连贯的视频.

2-损坏的1920x1080视频,除非我滚动到开头.

编辑

这是一个未经编辑的1080p视频示例,当我在VLC上播放并在手机上播放不正确时会显示绿屏,除非我滚动开始,现在奇怪地在YouTube上正常工作,除了开始时的绿框

这是一个720p视频样本,在开始时也使用绿色框架进行编辑,并在编辑后清除像素化和滞后

这是我用来解码重新编码的代码:

do{
  Bitmap b1;

  if(edited_frames.containsKey(extractor.getSampleTime()))
    b1=BitmapFactory.decodeFile(edited_frames.get(extractor.getSampleTime()));
  else
    b1=decode(extractor.getSampleTime(),Preview_width,Preview_Height);

  if(b1==null) continue;

  Bitmap b_scal=Bitmap.createScaledBitmap(b1, Preview_width, Preview_Height, false);
  if(b_scal==null) continue;
  encode(b_scal, encoder, muxer, videoTrackIndex);
  lastTime=extractor.getSampleTime();
}while(extractor.advance());
Run Code Online (Sandbox Code Playgroud)

解码方法:

private Bitmap decode(final long time,final int width,final int height){
  MediaFormat newFormat = codec.getOutputFormat();
  Bitmap b = null;
  final int TIMEOUT_USEC = 10000;
  ByteBuffer[] …
Run Code Online (Sandbox Code Playgroud)

video android mediacodec mediamuxer

61
推荐指数
1
解决办法
6672
查看次数

C#中的Google Cloud Messaging Server端代码

我想为使用.Net的Android编写用于GCM(Google Cloud Messaging)的第三方服务器.官方文档给出了将其与servlet-api和gcm-server.jar(服务器端的Java帮助程序)一起使用的指南.

在C#中使用它有任何等价物吗?

c# google-cloud-messaging

14
推荐指数
2
解决办法
2万
查看次数

如何在Suger ORM Android中检查表是否存在

我正在使用Android应用程序,我正在使用Suger ORM进行数据库操作.现在我有一个场景,我必须检查"SomeTable"是否不存在然后创建它并插入记录,如果表已经存在并且有一些记录我必须更新记录.我已编写此代码以检查表是否不存在然后创建记录并保存它.

Total_Budget_List = Total_Budget.listAll(Total_Budget.class);
if (Total_Budget_List.size() == 0)
{
    for (int i=0;i<Total_Budget_List.size();i++)
    {
        totalbudget = new Total_Budget(Select_Members.get(i).getId()+"",CurrentDate,per_person_budget+"");
        totalbudget.save();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到的数据库中没有这样的表.现在我如何检查表是否存在并且该表中是否有任何记录.

orm android android-sqlite sugarorm

5
推荐指数
1
解决办法
1783
查看次数

^ scanf修饰符实际上做了什么?

我已经搜索并读取了^修饰符状态以忽略你放在[]中的任何内容scanf.例如:

int val;   
scanf("%[^abc] %d, &val);  
printf("val is %d", val);  
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入abc42,我认为abc将被忽略,42将被存储到val中.但是,这不会发生.

我也尝试scanf通过制作来抑制它:

scanf("%*[^abc] %d, &val);
Run Code Online (Sandbox Code Playgroud)

但这也行不通.所以我对^实际上做了什么很困惑.

c scanf

3
推荐指数
2
解决办法
642
查看次数

检查StringBuilder是否为null

在尝试StringBuilder从缓存中填充后,我尝试检查a 是否为null:

StringBuilder videoSitemap;

if (AppSettings.CachingEnabled)
{
    videoSitemap = CacheHelper.Get<StringBuilder>("DynamicVideoSitemap");
}

if (videoSitemap == null)
{
    videoSitemap = new StringBuilder();
    ....
}
Run Code Online (Sandbox Code Playgroud)

但是在尝试编译时遇到以下错误:

CS0165使用未分配的变量'videoSitemap'

我该怎么做,然后检查对象是否为空 - 如果我实例化它但不使用缓存,那么StringBuilder永远不会为null

.net c#

1
推荐指数
1
解决办法
541
查看次数